Главная страница
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.041 c
14-1109693539
Гарри Поттер
2005-03-01 19:12
2005.03.20
Тест на знание великого могучего


1-1109765001
Lakshmy
2005-03-02 15:03
2005.03.20
Незапланированные точки останова


4-1106976743
kvit
2005-01-29 08:32
2005.03.20
Как заставить модем...


3-1108545014
juice
2005-02-16 12:10
2005.03.20
Interbase. Наборы данных


1-1110222402
ser35
2005-03-07 22:06
2005.03.20
Как отобразить текст?