Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

Timer в dll   Найти похожие ветки 

 
Vilux ©   (2005-03-09 08:52) [0]

Имеется программа, которая при запуске загружает в себя 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 не выгружается из памяти, то по идее он должен срабатывать... но почему не срабатывает?


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

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


 
Vilux ©   (2005-03-09 09:01) [2]

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


 
_sulent   (2005-03-09 09:07) [3]

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

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

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


 
BiN ©   (2005-03-09 09:20) [4]

Vilux ©   (09.03.05 08:52)

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


 
Erik1 ©   (2005-03-09 11:01) [5]

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


 
Eraser ©   (2005-03-09 11:31) [6]

Vilux ©

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



Страницы: 1 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
14-1109230163
DelphiN!
2005-02-24 10:29
2005.03.20
Надежность сервера баз данных FireBird 1.5


1-1109420614
Глеб
2005-02-26 15:23
2005.03.20
Использование тем Windows XP


3-1108547759
samalex
2005-02-16 12:55
2005.03.20
Сообщение об изменениях в БД


14-1109278251
тихий вовочка
2005-02-24 23:50
2005.03.20
Нужно ли высшее образование програмисту?


1-1109831333
Veles
2005-03-03 09:28
2005.03.20
Преобразование в HEX