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

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

Timer в dll [D7, WinXP]


Vilux ©   (2005-03-09 08:52:00) 

Имеется программа, которая при запуске загружает в себя dll, а затем время от времени запускает процедуру из этой dll. Требуется, чтобы эта процедура создала внутри себя таймер, который бы срабатывал даже когда эта процедура закончилась.
В dll я сделал так:
...
type
TMYTimer=class
public
 Timer:TTimer;
 procedure OnTimer(Sender:TObject);
end;
var MyTimer:TMYTimer;
т.е. сделал глобальную переменную, а затем в одной из процедур в dll делаю

if Timer=nil then
begin
 MyTimer:=TMYTimer.Create;
 MyTimer.Timer:=TTimer.Create(nil);
 MyTimer.Timer.Interval:=10000;
 MyTimer.Timer.OnTimer:=MyTimer.OnTimer;
 MyTimer.Timer.Enabled:=true;
end;

Но таймер не срабатывает, т.е. MyTimer.OnTimer не вызывается (ее код я здесь не привожу)
Т.е. из главной программы я вызываю процедуру в dll, которая создает этот таймер и заканчивает работу, но т.к. таймер сам глобальный, а dll не выгружается из памяти, то по идее он должен срабатывать... но почему не срабатывает?


Eraser   (2005-03-09 11:31:00) [1]

Vilux ©

И передачу события организуй как callback функцию...


Erik1   (2005-03-09 11:01:00) [2]

А лучше неиспользовать стандартный таймер, возми таймер реализованый в потоке.


BiN   (2005-03-09 09:20:00) [3]

Vilux ©   (09.03.05 08:52)

Поток, создающий таймер, должен иметь цикл выборки оконных сообщений.


_sulent   (2005-03-09 09:07:00) [4]

Впринципе все делаешь так же, еще знаешь что, проврерь, работает ли та функция OnTimer и так ли она работает
t := TTimer.Create(Application);
t.interval := 1000;
t.onTimer := TimerStart; {Определяешь функцию}
t.Enabled := true;

если таймер у тебя не работает нормально, то попробуй переопределить функцию!
Если уже и это не поможет. То тогда можно будет сделать просто:
делаешь функцию, или класс, который будет возвращать таймер и переопределять его в главной форме.

И каким образом ты грузишь в главную форму DLL?


Vilux   (2005-03-09 09:01:00) [5]

А как мне сделать, чтобы таймер создался в dll, но работал постоянно, пока dll не выгрузится из памяти или пока я сам его не отключу другой процедурой. Просто он вообще не срабатывает. По идее, когда он срабатывает, он должен послать главному приложение через SendMessage определенное сообщение, но оно не шлется,т.е. таймер не запускается.
Мне это нужно для поодержки многомодульности программы, чтобы каждый модуль (dll-ка) могли сами создавать свои таймеры, которые бы работали на всем протяжении работы главной программы, а то до этого мне приходилось в главной программе создавать... но это неудобно


_sulent   (2005-03-09 08:55:00) [6]

он глобальный для чего? Для того, куда ты его вызываешь. Вырабатывает он себя до тех пор пока не будет вызвана функция:
MyTimer.timer.Free...
Но конкретно для того пространства, в котором он работает... это важно!


Наверх

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