Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать таймер в потоке


Страницы:   1 2

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 в впотоке эт какая-то, бессмыслица.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо