![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread + TTimer
vecna © (2005-08-30 16:47:00)Че-та мне снова пора в отпуск...
Можно ли успользовать в потоках TTimer? С одной стороны он реализуется APIфункциями, с другой он наследник TComponent и это вызывает сомнения.
Leonid Troyanovsky (2005-08-31 09:13:00) [21]
> Суслик © (30.08.05 17:10) [2]
..
> kTimer := TTimer.Create(nil);
..
> while true do
> if GetMessage(kMsg, 0, 0, 0) then
> begin
> TranslateMessage(kMsg);
> DispatchMessage(kMsg);
Про true уже говорили, т.е., лучше while GetMessage do.
Кроме того, для такого потока лучше сделать свой Terminate,
который пошлет потоку WM_QUIT. Ну, и, наверное, свой
Free, т.к. Terminate - статический.
Стоит также отметить, что сам TTimer создает окно верхнего
уровня, что такому потоку никчему.
Т.е., можно просто
procedure TimerFunc(hwnd:HWND; msg: UINT; idEvent:UINT; dwTime: DWord); stdcall;
begin
..
end;
var
msg: TMsg;
begin
SetTimer(0, 0, 1000, @TimerFunc);
while GetMessage(msg, 0, 0, 0) do
DispatchMessage(msg);
end.
--
Regards, LVT.
Leonid Troyanovsky (2005-08-31 08:57:00) [22]
> Reindeer Moss Eater © (30.08.05 17:14) [3]
> И что же будет делать поток, ожидая очередного тика таймера?
> Крутить тупой пустой цикл?
Ждать сообщений - GetMessage.
--
Regards, LVT.
Digitman (2005-08-30 17:43:00) [23]
> Нужно уметь парктически сразу определять, что Terminated
> = true
и что этому мешает ?
и как этому может помочь таймер, если код обработки его "тика" будет выполнен не иначе как в том же трэде, который у тебя в момент "тика" занят какими-то иными длительнымы вычислениями ?
нет, ну проктологическое решение, конечно же найдется, но надо ли оно ? смею предположить, что ты его просто "не потянешь" за отсутствием достаточных знаний о контексте трэда ..
Reindeer Moss Eater (2005-08-30 17:25:00) [24]Вот именно.
Таймер-то зачем?
Суслик (2005-08-30 17:19:00) [25]А зачем в потоке может понадобиться таймер вообще?
vecna (2005-08-30 17:19:00) [26]2Суслик
Ага, спасибо, попробую
2Reindeer Moss Eater
Нужно уметь парктически сразу определять, что Terminated = true.
Суслик (2005-08-30 17:16:00) [27]
> [5] Lamer@fools.ua © (30.08.05 17:15)
да это тест, я его за 1.5 минуты написал с отладкой: true - короче
Lamer@fools.ua (2005-08-30 17:15:00) [28]Я бы
while true do
заменил на
while not Terminated do
Суслик (2005-08-30 17:15:00) [29]
> [3] Reindeer Moss Eater © (30.08.05 17:14)
согласен :)
но на вопрос мой пост вроде отвечает
Reindeer Moss Eater (2005-08-30 17:14:00) [30]И что же будет делать поток, ожидая очередного тика таймера?
Крутить тупой пустой цикл?
Зачем тогда вообще таймер, если тупой цикл крутится и без него?
:)
Суслик (2005-08-30 17:10:00) [31]Можно, если обрабатывать сообщения самому.
Типа такого (за точность и правильность не ручаюсь, но работает)
type
TMyThread = class(TThread)
procedure Execute(); override;
procedure fOnTimer(Sender: TObject);
procedure fDoSomething();
end;
procedure TMyThread.Execute();
var
kTimer: TTimer;
kMsg: TMsg;
begin
kTimer := TTimer.Create(nil);
try
kTimer.OnTimer := fOnTimer;
kTimer.Interval := 1000;
kTimer.Enabled := True;
while true do
if GetMessage(kMsg, 0, 0, 0) then
begin
TranslateMessage(kMsg);
DispatchMessage(kMsg);
end;
finally
kTimer.Free();
end;
end;
procedure TMyThread.fOnTimer(Sender: TObject);
begin
Synchronize(fDoSomething);
end;
procedure TMyThread.fDoSomething();
begin
Form1.Memo1.Lines.Add('a');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
TMyThread.Create(False);
end;
Erik1 (2005-08-30 17:03:00) [32]Нет, поскольку используется механизм сообщений. Для этого надо использовать спецальный таймер. http://www.delphikingdom.com/asp/viewitem.asp?catalogid=434