| Автор
| Сообщение |
|
|
|
Цитата |
|
Всем привет!
Необходимо совершить определенные действия в программе каждую минуту. Было бы очень интерсно узнать какие есть альтернативы использованию таймера Делфи (TTimer).
Может быть можно при помощи Виндоус АПИ "подписаться" на оповещение о том, что истек определенный промежуток времени (например одна минута) ? |
|
| В начало |
|
 |
|
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Код: | | Sleep(кол-во милисекунд) |
|
|
| В начало |
|
 |
 dogma
aka Достоевский

Возраст: 27
Знак зодиака: 
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
|
|
|
Цитата |
|
Слышал, что sleep сильно загружает систему, да и вроде бы здесь он по смыслу не подходит - ведь нужно соврешать действия через определенный промежут времени. Можно было бы заюзать объект ядра "событие", но это полный изврат. _________________ Bonum initium est dimidium facti
SQL-задачи (on-line) |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
to dogma
sleep просто приостанавливает поток, в котором был вызван, он просто не может загружать систему.
| NikotiN писал(а): | | можно и timeSetEvent поюзать |
пример использования:
подключаем mmsystem
создаем таймер
| Код: | var
TimerId: Cardinal;
.....
TimerId:=timeSetEvent(1000, 10, @FNTimeCallBack, 0, TIME_PERIODIC); // таймер с интервалом 1 сек |
обрабатываем событие
| Код: | procedure FNTimeCallBack(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;
begin
// обрабатываем событие
end; |
останавливаем таймер
| Код: | | timeKillEvent(TimerId); |
_________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
| Цитата: | | Можно было бы заюзать объект ядра "событие" |
Согласен, и это можно
пример использования:
создаем поток таймера
| Код: | var
StopTimerEvent: Cardinal;
ThrId: cardinal;
.....
CreateThread(nil, 0, @ThreadFunc, nil, 0, ThrId); |
обрабатываем событие
| Код: | function ThreadFunc(Param: DWord): DWord; stdcall;
begin
StopTimerEvent:=CreateEvent(nil, false, false, 'Timer');
while WaitForSingleObject(StopTimerEvent, 1000)<>WAIT_OBJECT_0 do
begin
// здесь обрабатываем событие
end;
end; |
останавливаем таймер
| Код: | | SetEvent(StopTimerEvent); |
_________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
А не легче создать TThread синхронизироватся по часам??? _________________
 |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
to TuXAPuK
интересно посмотреть на твою реализацию этого способа  _________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
| Ktf писал(а): | to TuXAPuK
интересно посмотреть на твою реализацию этого способа  | TDateTime это всего-лиш 64х битный Integer... делить его можно как захочется... Да и не стоит забывать про DateUtils.MinuteOf(); и.т.п. Хотя в принцепе в маштабах одной минуты это не самый подходящий способ.. Но всёравно вариант остаётся вариантом...  _________________
 |
|
| В начало |
|
 |
|
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
to TuXAPuK
Я не понял суть твоего варианта!
Создать поток и в бесконечном цикле проверять, подошло ли время?
Поясни-ка. _________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
| Ktf писал(а): | to TuXAPuK
Создать поток и в бесконечном цикле проверять, подошло ли время? | to Ktf
В прицепе так оно и задумывалось...  _________________
 |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
to TuXAPuK
так не пойдет.
во-первых, это большая нагрузка на проц
а во-вторых, winapi здесь не пахнет _________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
to Ktf
| Ktf писал(а): | | во-первых, это большая нагрузка на проц | Не вижу проблемы. Ведь SetTimer создаёт тот-же TThread только не в твоей проге, а в SystemIdleProcess который считает практически по тому-же принцепу... Тут не маленькие дети собрались, про TThread.Priority все слышали...
| Ktf писал(а): | | а во-вторых, winapi здесь не пахнет | Не спорю... Зато есть другой плюс. Эта фишка на линуксах хорошо пройдёт... _________________
 |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
| Цитата: | | Не вижу проблемы. Ведь SetTimer создаёт тот-же TThread только не в твоей проге, а в SystemIdleProcess который считает практически по тому-же принцепу... |
Нашел что с чем сравнивать - уровень приложения с уровнем ядра.
| Цитата: | | Тут не маленькие дети собрались, про TThread.Priority все слышали... |
установка низкого значения TThread.Priority приведет к тому, что твой "таймер" практически всегда будет срабатывать с опозданием. _________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
|