Вниз
Скачать: CL | DM;

Проблема с таймером в MMSystem   Найти похожие ветки 

← →
cyborg ©   (2002-11-10 13:51) [0]

У меня в программе создаётся таймер

procedure On_Timer(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall;
Begin
End;
........
//Устанавливаю таймер
MM_Timer:=timeSetEvent(5, 0, addr(On_Timer), 0, TIME_PERIODIC);
..
//При завершении программы освобождаю его
timeKillEvent(MM_Timer);


При том с вероятностью 80% при завершении программы вылазит на пару секунд сообщение об ошибке, что мол по такому адресу не могу и благополучно исчезает. Видимо как-то при завершении программы, та процедура уже выгружается из памяти, хотя это странно, ведь программа ещё не завершилась, и при освобождении что-то куда-то пытается обратиться.
Может я чего делаю не так? В чём дело? Как правильно сделать?
Маленький пример если можно.


← →
pasha676   (2002-11-10 13:59) [1]

Боюсь ошибиться, с таймерами не работал. Но по выходу ты "убиваешь" эвент, а сам таймер убиваешь или нет?


← →
MBo ©   (2002-11-10 14:12) [2]

Все у тебя написано нормально. addr не нужно, но это не вредит.
У меня выполняется без ошибок. Может, в содержимом On_Timer проблемы?


← →
bg8 ©   (2002-11-10 17:09) [3]

Советую в начале On_Timer`а писать timeKillEvent, а в конце - снова запускать


← →
cyborg ©   (2002-11-10 22:06) [4]

Вот часть головного модуля:

procedure On_Timer(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall;
Begin
if ActiveProgram then Draw3D;

//Тут, если программа активна, т.е. если не переключена задача
//на другую программу, тогда отрисовать графику
End;

BEGIN
FirstProgramRun:=false;
Try
hRet:=InitD3D; //Инициализация 3D
if hRet<>0 then LogError(DXGErrorString(hRet),"InitD3D") else LogStatus("Инициализация 3D прошла успешно!","InitD3D");
MM_Timer:=timeSetEvent(5, 0, addr(On_Timer), 0, TIME_PERIODIC);

//Цикл программы на обработку сообщений окна
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;

Finally
ActiveProgram:=False;
timeKillEvent(MM_Timer);
LogStatus( "Завершение программы", "Finally in Head unit" );
Cleanup; //Освобождение ресурсов
ShowWindow(Handle, SW_MINIMIZE);
End;//Finally


гы, хотя сейчас дошло, возможно это из за ShowWindow(Handle, SW_MINIMIZE); программа закрывается после закрытия главного окна, может поэтому. Сейчас попробую и скажу, хотя ошибка не всегда выходит.


← →
cyborg ©   (2002-11-10 22:11) [5]

Нет, не изменилось, так и появляется иногда и исчезает через секунду-две окошко с сообщением об ошибке, там какой-то С++ рантайм еррор, function call чего-то неправильно. Ставлю виндоузный таймер, работает нормально, но у него точность в 10 мс. меня не устраивает. Есть ли в DirectX свой таймер, как его создавать?



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.015 c
6-76056
IInvokable
2003-01-05 17:36
2003.02.24
Использование сложных типов данных в XML Web Services? Как?


1-75883
Alex Krotov
2003-02-14 00:39
2003.02.24
на каком языке написана


7-76212
izyum
2002-12-20 14:52
2003.02.24
События клавиатуры


6-76075
1g0r
2003-01-03 19:09
2003.02.24
Проблема с UDP обменом (API- NMUDP)


14-76191
Anar
2003-02-07 21:03
2003.02.24
Помогите с созданием форума на сайте




   Наверх