Главная страница
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.063 c
1-1109937507
DimonNew
2005-03-04 14:58
2005.03.20
TList и new и dispose и ограничение по расмеру


3-1108928359
Vadim
2005-02-20 22:39
2005.03.20
Сортировка связанного поля


6-1106216491
New User
2005-01-20 13:21
2005.03.20
Как раскодиравть коки


14-1109518495
ve7al
2005-02-27 18:34
2005.03.20
xачу начат програмирыват,счиво начинат??


6-1101368472
Жуков
2004-11-25 10:41
2005.03.20
Сообщения по локальной сети