![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с таймером в MMSystem [D6, WinXP]
cyborg © (2002-11-10 13:51:00)У меня в программе создаётся таймер
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% при завершении программы вылазит на пару секунд сообщение об ошибке, что мол по такому адресу не могу и благополучно исчезает. Видимо как-то при завершении программы, та процедура уже выгружается из памяти, хотя это странно, ведь программа ещё не завершилась, и при освобождении что-то куда-то пытается обратиться.
Может я чего делаю не так? В чём дело? Как правильно сделать?
Маленький пример если можно.
cyborg (2002-11-10 22:11:00) [1]Нет, не изменилось, так и появляется иногда и исчезает через секунду-две окошко с сообщением об ошибке, там какой-то С++ рантайм еррор, function call чего-то неправильно. Ставлю виндоузный таймер, работает нормально, но у него точность в 10 мс. меня не устраивает. Есть ли в DirectX свой таймер, как его создавать?
cyborg (2002-11-10 22:06:00) [2]Вот часть головного модуля:
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); программа закрывается после закрытия главного окна, может поэтому. Сейчас попробую и скажу, хотя ошибка не всегда выходит.
bg8 (2002-11-10 17:09:00) [3]Советую в начале On_Timer`а писать timeKillEvent, а в конце - снова запускать
MBo (2002-11-10 14:12:00) [4]Все у тебя написано нормально. addr не нужно, но это не вредит.
У меня выполняется без ошибок. Может, в содержимом On_Timer проблемы?
pasha676 (2002-11-10 13:59:00) [5]Боюсь ошибиться, с таймерами не работал. Но по выходу ты "убиваешь" эвент, а сам таймер убиваешь или нет?