Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Таймер без формы. [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо