Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
ВнизКак сделать таймер в потоке Найти похожие ветки
← →
Piero © (2005-12-06 10:33) [0]Как сделать таймер в TTheard
← →
Reindeer Moss Eater © (2005-12-06 10:38) [1]Что значит сделать?
Он уже сделан.
Класс TTimer
← →
Digitman © (2005-12-06 10:40) [2]например, так:
TMyThread = class(TThread)
..
FTimer: Timer;
..
procedure TimerEventHandler(Sender: TObject);
procedure Execute; override;
..
end;
..
procedure TMyThread.TimerEventHandler(Sender: TObject);
begin
.. do something here ...
end;
procedure TMyThread.Execute;
begin
..
FTimer := TTimer.Create(..);
try
FTimer.OnTimer := TimerEventHandler;
..
finally
FTimer.Free;
end;
..
end;
← →
Piero © (2005-12-06 11:01) [3]А в качестве Owner, что я должен передовать в TTimer.Create(..)?
← →
Digitman © (2005-12-06 11:04) [4]да что угодно)... хоть тот же nil ..
← →
Piero © (2005-12-06 11:05) [5]Собственно в этом и была проблемма, в форме я бы передал nil, а в потоке?
← →
Piero © (2005-12-06 11:06) [6]Не посмотрел последний пост, но с nil - не работает
← →
Digitman © (2005-12-06 11:08) [7]
> в форме я бы передал nil, а в потоке?
а какая принципиальная разница ?
владельцем компонента м.б. либо другой компонент либо nil, если владелец не назначается ... а уж где конструктор компонента вызывается - то ли в коде формы то ли еще где-то - строго фиолетово
← →
Piero © (2005-12-06 11:10) [8]Таймер создается
FTimer := TTimer.Create(nil);
FTimer.Interval:=100;
Ftimer.Enabled:=true;
FTimer.OnTimer := TimerEventHandler;
но TimerEventHandler - не срабатывает
← →
Digitman © (2005-12-06 11:10) [9]
> с nil - не работает
ой врешь)
← →
Digitman © (2005-12-06 11:12) [10]
> TimerEventHandler - не срабатывает
он и с не-nil не будет "срабатывать", потому что цикл диспетчеризации сообщений нужен
← →
Piero © (2005-12-06 11:21) [11]значит ты не дописал пример?
нужно перехватывать wm_timer
← →
Digitman © (2005-12-06 11:23) [12]
> значит ты не дописал пример?
я ответил в точности на твой вопрос, так как он был тобой поставлен
> нужно перехватывать wm_timer
не нужно ничего "перехватывать" - нужен обычный цикл ожидания/выборки/диспетчеризации оконных сообщений
← →
Reindeer Moss Eater © (2005-12-06 11:24) [13]А если будет какой-то цикл, то таймер-то становится не нужен вообще.
← →
Digitman © (2005-12-06 11:27) [14]
> Reindeer Moss Eater © (06.12.05 11:24) [13]
на вкус и цвет, как говорится) .. ну сам знаешь
мало ли зачем он автору ! ну вот нужен ему таймер - что ж тут плохого ?
← →
Piero © (2005-12-06 11:31) [15]Что такое цикл ожидания/выборки/диспетчеризации оконных сообщений,
и как его делать
я могу сделать так:
while ... do
begin
sleep(1000);
...
end;
Ну здесь таймер уже, действетельно не нужен
← →
Piero © (2005-12-06 11:32) [16]и почему оконных сообщений, я хочу обойтись одним потоком
← →
DesWind © (2005-12-06 11:35) [17]Мож автору нужен не таймер в потоке, а поток с какой-то периодичностью? ИМХО ТTimer в впотоке эт какая-то, бессмыслица.
← →
Piero © (2005-12-06 11:38) [18]DesWind ©,
Почему? будет происходить одна и та же операция с высокой периодичностью. чего мне 100 раз поток запускать и останавливать?
← →
Digitman © (2005-12-06 11:41) [19]
> могу сделать так
а надо бы примерно так :
while not Terminated and GetMessage(msg, 0, 0, 0) do
DispatchMessage(Msg)
← →
Piero © (2005-12-06 11:46) [20]Digitman ©, можешь сказать зачем ты написал код (вначале), который не работает? то что ты пишешь сейчас, к прошлому коду никакого отношения не имеет
← →
Anatoly Podgoretsky © (2005-12-06 11:48) [21]Зачем таймер в потоке?
← →
Piero © (2005-12-06 11:48) [22]и этот работать не будет
BOOL GetMessage(
LPMSG lpMsg, // address of structure with message
HWND hWnd, // handle of window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax // last message
);
handle of window ? откуда мне его взять
← →
Leonid Troyanovsky © (2005-12-06 11:48) [23]
> Digitman © (06.12.05 11:41) [19]
> а надо бы примерно так :
> while not Terminated and GetMessage(msg, 0, 0, 0)
Лучше в Terminate - inherited; PostThreadMessage(.., WM_QUIT,0,0).
Ну, и в Destroy тоже Teminate; inherited.
--
Regards, LVT.
← →
Digitman © (2005-12-06 11:52) [24]
> Piero © (06.12.05 11:46) [20]
> зачем
затем чтобы ты думал головой, а не иным местом)... и затем чтобы ты не передирал чужой код один-в-один, а думал как построить след.вопрос по непонятому тобой в предыдущем вопросе ..
> то что ты пишешь сейчас, к прошлому коду никакого отношения
> не имеет
да что ты говоришь ?!)
procedure TMyThread.Execute;
begin
..
FTimer := TTimer.Create(..);
try
FTimer.OnTimer := TimerEventHandler;
.. //ЗДЕСЬ должен быть тот самый цикл !
finally
FTimer.Free;
end;
..
end;
← →
Digitman © (2005-12-06 11:54) [25]
> Leonid Troyanovsky © (06.12.05 11:48) [23]
можно и так ...
но важно понимание автором сути, а не конкретная реализация чего-то там, связанного с сообщениями
← →
Digitman © (2005-12-06 11:56) [26]
> Piero © (06.12.05 11:48) [22]
> handle of window ? откуда мне его взять
оттуда)... из справки стандартной) .. в которой написано черным по белому:
hWnd
Identifies the window whose messages are to be retrieved. One value has a special meaning:
Value Meaning
NULL GetMessage retrieves messages for any window that belongs to the calling thread and thread messages posted to the calling thread via PostThreadMessage.
← →
Piero © (2005-12-06 12:00) [27]Да действительно получилось...
Digitman ©, все равно отвечаешь непонятно
← →
Piero © (2005-12-06 12:02) [28]а чем эта реализация качественно отличается от той, что я предложил?
← →
Digitman © (2005-12-06 12:05) [29]
> все равно отвечаешь непонятно
как спрашиваешь, так и отвечаю)
> чем эта реализация качественно отличается от той, что я
> предложил?
а где ты что-то там предложил, касаемое TTimer и диспетчеризации/обработки оконных сообщений. им формируемых ? я не вижу ...
← →
Piero © (2005-12-06 12:09) [30]while ... do
begin
sleep(1000);
TimerEventHandler;
end;
Чем это отличается от того, чтобы посылать сообщение и тут же его принимать (с помощью таймера !!!),
while not Terminated and GetMessage(msg, 0, 0, 0) do
DispatchMessage(Msg)
на хрена вообще таймер ?
← →
Digitman © (2005-12-06 12:12) [31]
> Piero © (06.12.05 12:09) [30]
> Чем это отличается от того, чтобы посылать сообщение и тут
> же его принимать (с помощью таймера
во время выполнения sleep() твой поток глух и нем, потому что ф-ция - синхронная
> на хрена вообще таймер ?
здрасть-приехали !)
это у тебя нужно спросить. зачем он тебе) ... вопрос-то ты задал)
← →
DesWind © (2005-12-06 12:41) [32]Если нужно чтоб функция выполнялась с периодичностью независимой от времени ее выполнения, то я бы реализовал это так
unit MainForm
...
var
TmrEvnt: TSimpleEvent;
// OnTimer
TmrEvnt.SetEvent;
unit TrdUnit
//Execute
wile not terminated do
begin
TmrEvent.WaitFor;
...
TmrEvent.ResetEvent;
end
Что-то вроде этого.
← →
Piero © (2005-12-06 13:24) [33]Digitman ©, все действительно работает, только я все равно не понимаю, как
while not Terminated and GetMessage(msg, 0, 0, 0) do
DispatchMessage(Msg),
связано с таймером??? причем msg : TagMsg;, но я не задавал в программе полей msg, как это происходит?
← →
Digitman © (2005-12-06 13:42) [34]
> все равно не понимаю, как .. связано с таймером?
для этого есть исх.текст в юните ExtCtrls.pas, проанализировав который на предмет реализации св-в/методов/событий класса TTimer ты обнаружишь, что при выполнении строчки Timer.Enabled := True класс TTimer создает невидимое окно, которому впоследствии и будут поступать периодические сообщения WM_TIMER ..
причем окно будет создано именно в том потоке, который установил Enabled := True ...
значит, именно этот поток, имея отныне собственную очередь win-сообщений, ответственен за ожидание/выборку/диспетчеризацию/обработку сообщений, адресованных кем бы то ни было окнам, им созданным .. в т.ч. и WM_TIMER
при выполнении GetMessage() поток выбирает очередное сообщение (ожидая при необходимости появления хотя бы одного) из своих очередей сообщений
при выполнении DispatchMessage(Msg) поток диспетчеризует выбранное сообщение, передавая его на обработку соответствующей оконной ф-ции, одна из которых в конечном итоге вызовет п/программу, указанную тобой в св-ве OnTimer
> msg : TagMsg;, но я не задавал в программе полей msg
вот уж не знаю, как твой компилятор справился с этим ..
в соответствии с правилами Паскаля, если ты указал некий идентификатор, то его декларация ОБЯЗАНА присутствовать ранее по тексту программы.
← →
Piero © (2005-12-06 13:56) [35]Спасибо, примерно понял
деклорация есть
var msg : TagMsg,
просто я не описал поля msg,
но это и не важно в обработчике, я их не анализирую.
Спасибо, что рассказал так подробно
← →
REA (2005-12-06 15:48) [36]CreateWaitableTimer еще
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.014 c