![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как во время убить мультимедиа таймер? [D7, WinXP]
Alex_C © (2006-11-29 09:15:00)В моей проге для обеспечения точного времени вызова события используется мультимедиа таймер. У пользователя есть возможность изменять время работы события. При измененни времени события я делаю так:
// Убиваем старый траймер
timeKillEvent( mmResult );
// Создаем новый таймер с новым временем срабатывания
mmResult := TimeSetEvent(NewTimeInterval, 0, @TimerCallBack, 0, TIME_PERIODIC);
Однако вот в чем проблема - при этом необходимо, чтобы последнее время срабатывания таймера сохранилось (допустим, время срабатывания таймера 5 сек. Пользователь указал таймеру новое время срабатывания 6 сек. Однако это произошло на 2 сек работе таймера - т.е. не убивать таймер, пока не закончится последнее срабатывание таймера, а затем промежуток уже сделать 6 сек). Как это более правильно сделать?
Alex_C (2006-11-29 09:31:00) [1]Ок! Понятно! Спасибо!
Сергей М. (2006-11-29 09:27:00) [2]ПРимерно так:
var
NewTimeInterval, OldTimeInterval: UINT;
idTimer: MMRESULT;
...
function TimerCallBack(...)
begin
if NewTimeInterval <> OldTimeInterval then begin
timeKillEvent(mmResult);
OldTimeInterval := NewTimeInterval;
if NewTimeInterval <> 0 then
mmResult := TimeSetEvent(NewTimeInterval, 0, @TimerCallBack, 0, TIME_PERIODIC);
end;
...
end;
устанавливаем новый период:
NewTimeInterval := ....;
p.s.
Все обращения к статической переменной NewTimeInterval крайне желательно защитить крит.секцией.
Чапаев (2006-11-29 09:17:00) [3]Создай некий флаг, который будет сигнализировать об изменениях. В функции обратного вызова: если флаг установлен, то убить теперешний таймер, создать новый, сбросить флаг.