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

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

TThread + TTimer


Страницы:   1 2

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


Страницы:   1 2

Наверх

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