Главная страница
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.014 c
1-75964
Эд
2003-02-12 13:47
2003.02.24
стереть строку в StringGrid


14-76107
Marser
2003-02-02 21:20
2003.02.24
Народ! С 60-й вас годовщиной


1-75994
Programmer 7.03
2003-02-12 22:58
2003.02.24
Как шифровать ресурсы?


8-76044
cyborg
2002-11-10 13:51
2003.02.24
Проблема с таймером в MMSystem


1-75940
TButton
2003-02-14 08:35
2003.02.24
GetAsyncKeyState