![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать таймер в потоке
Piero © (2005-12-06 10:33:00)Как сделать таймер в TTheard
REA (2005-12-06 15:48:00) [1]CreateWaitableTimer еще
Piero (2005-12-06 13:56:00) [2]Спасибо, примерно понял
деклорация есть
var msg : TagMsg,
просто я не описал поля msg,
но это и не важно в обработчике, я их не анализирую.
Спасибо, что рассказал так подробно
Digitman (2005-12-06 13:42:00) [3]
> все равно не понимаю, как .. связано с таймером?
для этого есть исх.текст в юните 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:24:00) [4]Digitman ©, все действительно работает, только я все равно не понимаю, как
while not Terminated and GetMessage(msg, 0, 0, 0) do
DispatchMessage(Msg),
связано с таймером??? причем msg : TagMsg;, но я не задавал в программе полей msg, как это происходит?
DesWind (2005-12-06 12:41:00) [5]Если нужно чтоб функция выполнялась с периодичностью независимой от времени ее выполнения, то я бы реализовал это так
unit MainForm
...
var
TmrEvnt: TSimpleEvent;
// OnTimer
TmrEvnt.SetEvent;
unit TrdUnit
//Execute
wile not terminated do
begin
TmrEvent.WaitFor;
...
TmrEvent.ResetEvent;
end
Что-то вроде этого.
Digitman (2005-12-06 12:12:00) [6]
> Piero © (06.12.05 12:09) [30]
> Чем это отличается от того, чтобы посылать сообщение и тут
> же его принимать (с помощью таймера
во время выполнения sleep() твой поток глух и нем, потому что ф-ция - синхронная
> на хрена вообще таймер ?
здрасть-приехали !)
это у тебянужно спросить. зачем он тебе) ... вопрос-то ты задал)
Piero (2005-12-06 12:09:00) [7]while ... do
begin
sleep(1000);
TimerEventHandler;
end;
Чем это отличается от того, чтобы посылать сообщение и тут же его принимать (с помощью таймера !!!),
while not Terminated and GetMessage(msg, 0, 0, 0) do
DispatchMessage(Msg)
на хрена вообще таймер ?
Digitman (2005-12-06 12:05:00) [8]
> все равно отвечаешь непонятно
как спрашиваешь, так и отвечаю)
> чем эта реализация качественно отличается от той, что я
> предложил?
а где ты что-то там предложил, касаемое TTimer и диспетчеризации/обработки оконных сообщений. им формируемых ? я не вижу ...
Piero (2005-12-06 12:02:00) [9]а чем эта реализация качественно отличается от той, что я предложил?
Piero (2005-12-06 12:00:00) [10]Да действительно получилось...
Digitman ©, все равно отвечаешь непонятно
Digitman (2005-12-06 11:56:00) [11]
> 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 anywindow that belongs to the calling thread and thread messages posted to the calling thread via PostThreadMessage.
Digitman (2005-12-06 11:54:00) [12]
> Leonid Troyanovsky © (06.12.05 11:48) [23]
можно и так ...
но важно понимание автором сути, а не конкретная реализация чего-то там, связанного с сообщениями
Digitman (2005-12-06 11:52:00) [13]
> Piero © (06.12.05 11:46) [20]
> зачем
затем чтобы ты думал головой, а не иным местом)... и затем чтобы ты не передирал чужой код один-в-один, а думал как построить след.вопрос по непонятому тобой в предыдущем вопросе ..
> то что ты пишешь сейчас, к прошлому коду никакого отношения
> не имеет
да что ты говоришь ?!)
procedure TMyThread.Execute;
begin
..
FTimer := TTimer.Create(..);
try
FTimer.OnTimer := TimerEventHandler;
.. //ЗДЕСЬ должен быть тот самый цикл !
finally
FTimer.Free;
end;
..
end;
Leonid Troyanovsky (2005-12-06 11:48:00) [14]
> 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.
Piero (2005-12-06 11:48:00) [15]и этот работать не будет
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 ? откуда мне его взять
Anatoly Podgoretsky (2005-12-06 11:48:00) [16]Зачем таймер в потоке?
Piero (2005-12-06 11:46:00) [17]Digitman ©, можешь сказать зачем ты написал код (вначале), который не работает? то что ты пишешь сейчас, к прошлому коду никакого отношения не имеет
Digitman (2005-12-06 11:41:00) [18]
> могу сделать так
а надо бы примерно так :
while not Terminated and GetMessage(msg, 0, 0, 0) do
DispatchMessage(Msg)
Piero (2005-12-06 11:38:00) [19]DesWind ©,
Почему? будет происходить одна и та же операция с высокой периодичностью. чего мне 100 раз поток запускать и останавливать?
DesWind (2005-12-06 11:35:00) [20]Мож автору нужен не таймер в потоке, а поток с какой-то периодичностью? ИМХО ТTimer в впотоке эт какая-то, бессмыслица.