![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Таймер без формы. [D5, WinXP]
Rifo © (2004-09-18 18:45:00)Как организовать таймер, если программа не емеет формы, или если этот код находится в DLL?
Rifo (2004-09-18 19:53:00) [1]Alx2. Чего-то я не совсем понял про TThread, но спасибо за TTimer, похоже разбрался.
Alx2 (2004-09-18 19:40:00) [2]>Rifo © (18.09.04 19:34) [9]
Аналогично практически. Еще Help + особенности доступа к разделяемым ресурсам.
Код из DLL выполняется в том же адресном пространстве, что и основной поток. Но стандартные глобальные объекты Delphi-приложения (например, Application, Screen) различны. Это стоит учитывать. Для избежания головной боли можно попробовать BPL библиотеки вместо DLL. Тогда эта проблема снимется.
А в остальном - как и в приложении-хосте.
Rifo (2004-09-18 19:34:00) [3]Alx2, про TTimer более-менее ясно, а что про TThread как?
Alx2 (2004-09-18 19:29:00) [4]>Rifo © (18.09.04 19:21) [7]
На стадии инициализации класса-владельца (конструктор):
Timer1 := TTimer.Create(Nil); или self, если класс-владелец является потомком TComponent (тогда уничтожать в деструкторе Timer1 не надо)
Timer1.OnTimer := // Событие с типом TNotifyEvent. Timer1.Interval := ???;
Timer1.Enabled := true;
На стадии финализации (деструктор):
Timer1.Free;
Rifo (2004-09-18 19:21:00) [5]Alx2, приведи пожалуйста, как использовать класс TTimer в DLL.
Alx2 (2004-09-18 19:08:00) [6]А для фоновой работы, имхо, лучше TThread.
Если по будильнику - см. Waitable Timer Objects
Defunct (2004-09-18 19:06:00) [7]Rifo © (18.09.04 19:03) [3]
Тогда:
While not Terminated do
Begin
Sleep(Interval);
If Assigned(OnTimer) Then OnTimer(Self);
End;
Alx2 (2004-09-18 19:06:00) [8]>Rifo © (18.09.04 19:03) [3]
Займет ресурсов не больше, чем обычн.
Кроме того, если DLL сделана на Delphi, можно все-равно использовать класс TTimer
Rifo (2004-09-18 19:03:00) [9]Нужно, что-бы этот процесс занимал как можно меньше ресурсов компа, т. к. задумано для фоновой работы.
Palladin (2004-09-18 18:55:00) [10]SetTimer
Defunct (2004-09-18 18:54:00) [11]с помощью потока.
в execute должно быть что-то типа такого:
While not Terminated do
Begin
Sleep(10);
CurrentTime := CurrentTime + 10;
If CurrentTime >= Interval Then
Begin
If Assigned(OnTimer) Then OnTimer(Self);
CurrentTime := 0;
End;
End;