Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.015 c
3-75802
Sour
2003-02-06 13:19
2003.02.24
Как уменьшить рамер БД (Interbase).


1-76010
vogus
2003-02-12 19:17
2003.02.24
Почему MDIChild сначала появляется, а потом разворачивается


3-75814
UnderSun
2003-02-05 00:27
2003.02.24
Проблемы с обновлением запроса из др потока (IB 6.5)


14-76150
Shadow
2003-02-06 21:16
2003.02.24
Интересно...


14-76189
Oleg_Gashev
2003-02-09 02:19
2003.02.24
Последняя страница интернета