Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
14-1133138436
Kerk
2005-11-28 03:40
2005.12.25
Samara Mastak Party


2-1134313083
The Only
2005-12-11 17:58
2005.12.25
проблемы с меню


1-1132940888
igi
2005-11-25 20:48
2005.12.25
Поиск в бинарном файле


2-1133856902
Alex7
2005-12-06 11:15
2005.12.25
операция "in"


14-1133345762
Post
2005-11-30 13:16
2005.12.25
Настройки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский