Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


Возможность "подписаться" на оповещение каждую мин


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Anatoly_71
Гость







СообщениеПн, 07-Ноя-2005 15:01    Заголовок сообщения: Возможность "подписаться" на оповещение каждую мин
Цитата

Всем привет!

Необходимо совершить определенные действия в программе каждую минуту. Было бы очень интерсно узнать какие есть альтернативы использованию таймера Делфи (TTimer).

Может быть можно при помощи Виндоус АПИ "подписаться" на оповещение о том, что истек определенный промежуток времени (например одна минута) ?
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеПн, 07-Ноя-2005 15:32 
Цитата

цитирую сам себя :)

Цитата:
создание таймера
Код:
  TimerHandle:=SetTimer(0, 0, 1000, @TimerFunc); // таймер с интервалом 1 секунда

обработка события
Код:
  procedure TimerFunc(H: HWND; uMsg: UINT; idEvent: UINT; dwTime: DWord); stdcall;
  begin
    // обрабатываем событие
  end;

остановка таймера
Код:
  KillTimer(0, TimerHandle);


Список форумов Всё о Дельфи и C# от Чертенка -> Общие вопросы -> как докопаться до событий обьекта ?

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Gold_Dreamer
Гость







СообщениеПн, 07-Ноя-2005 16:22 
Цитата

Код:
Sleep(кол-во милисекунд)
В начало
Пол:Муж dogma
aka Достоевский


Возраст: 27
Знак зодиака: Телец
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
СообщениеВт, 08-Ноя-2005 3:22 
Цитата

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


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеВт, 08-Ноя-2005 6:20 
Цитата

to dogma
sleep просто приостанавливает поток, в котором был вызван, он просто не может загружать систему.

NikotiN писал(а):
можно и timeSetEvent поюзать

пример использования:

подключаем mmsystem
Код:
uses ... 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
СообщениеВт, 08-Ноя-2005 6:41 
Цитата

Цитата:
Можно было бы заюзать объект ядра "событие"

Согласен, и это можно :)

пример использования:

создаем поток таймера
Код:
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
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеВт, 08-Ноя-2005 6:58 
Цитата

А не легче создать TThread синхронизироватся по часам???
_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеВт, 08-Ноя-2005 7:21 
Цитата

to TuXAPuK
интересно посмотреть на твою реализацию этого способа :)

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеВт, 08-Ноя-2005 7:59 
Цитата

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


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеВт, 08-Ноя-2005 8:04 
Цитата

to TuXAPuK
Я не понял суть твоего варианта!
Создать поток и в бесконечном цикле проверять, подошло ли время? ;)
Поясни-ка.

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеВт, 08-Ноя-2005 8:12 
Цитата

Ktf писал(а):
to TuXAPuK
Создать поток и в бесконечном цикле проверять, подошло ли время?;)
to Ktf
В прицепе так оно и задумывалось...

_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеВт, 08-Ноя-2005 8:27 
Цитата

to TuXAPuK
так не пойдет.
во-первых, это большая нагрузка на проц
а во-вторых, winapi здесь не пахнет

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеВт, 08-Ноя-2005 8:56 
Цитата

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


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеВт, 08-Ноя-2005 11:19 
Цитата

Цитата:
Не вижу проблемы. Ведь SetTimer создаёт тот-же TThread только не в твоей проге, а в SystemIdleProcess который считает практически по тому-же принцепу...

Нашел что с чем сравнивать - уровень приложения с уровнем ядра. :)
Цитата:
Тут не маленькие дети собрались, про TThread.Priority все слышали...

установка низкого значения TThread.Priority приведет к тому, что твой "таймер" практически всегда будет срабатывать с опозданием.

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100