Текущий архив: 2003.02.24;
Скачать: 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 вся ветка
Текущий архив: 2003.02.24;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.014 c