Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

не работает Timer в отдельном потоке   Найти похожие ветки 

 
Мирон ©   (2004-10-05 11:51) [0]

procedure TMyThread.Execute;
var
   T: TTimer;
begin
   inherited;
   T := TTimer.Create(nil);
   T.Interval := 500;
   T.OnTimer := Timer;
   T.Enabled := true;
   Step := 0;
   try
       while (Step < 20) and not Terminated do begin
           if StepChanged
           then begin
               try
                   Synchronize(ShowProgress)
               finally
                   StepChanged := False;
               end;
           end;
       end;
   finally
       T.Free;
   end;
end;

procedure TMyThread.Timer(Sender: Tobject);
begin
   Step := Step + 1;
   StepChanged := True;
end;


В процедуру TMyThread.Timer(Sender: Tobject) так и не попадаем, и поток крутится на строчках
while (Step < 20) and not Terminated do begin
if StepChanged

пока не нажимаю кнопку стоп, где значится MyThread.Terminate

Или я тут чего-то не то наколбасил?


 
Romkin ©   (2004-10-05 11:59) [1]

ДА как тебе сказать... А зачем тебе поток-то вообще? Судя по коду - он нафиг не нужен ;)


 
Мирон ©   (2004-10-05 12:02) [2]

Так и говори! :)

Предположим, поток должен выполняться прибл. 10 секунд


 
Мирон ©   (2004-10-05 12:04) [3]

Можно, конечно и без таймера обойтись, но теперь мне из принципа интересно, почему мой код не работает...


 
DiamondShark ©   (2004-10-05 12:04) [4]

Чтобы TTimer работал, должен быть цикл выборки сообщений.


 
Romkin ©   (2004-10-05 12:05) [5]

Тут у тебя две грубые ошибки:
1. Фактически весь поток состоит из вызова Syncronize. Намекаю: функция, которую ты подаешь в этот метод, выполняется в контексте основного потока
2. Для работы таймера необходим цикл обработки сообщений :)
ТАк я и спрашиваю - а нафига такой поток?!


 
Digitman ©   (2004-10-05 12:06) [6]

destructor TMyThread.Destroy;
begin
 if GetcurrentThreadId <> ThreadId then
  PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
 inherited;
end;

procedure TMyThread.Execute;
var
  T: TTimer;
begin
  T := TTimer.Create(nil);
  T.Interval := 500;
  T.OnTimer := Timer;
  T.Enabled := true;
  Step := 0;
  try
      while  not Terminated and GetMessage(Msg, 0,0,0) do begin
         Dispatchmessage(Msg);
  finally
    T.Free;
  end;
end;

procedure TMyThread.Timer(Sender: Tobject);
begin
  Step := Step + 1;
  if Step < 20 then
   Synchronize(ShowProgress)
  else
   Terminate;
end;


 
Romkin ©   (2004-10-05 12:06) [7]

Архангельского начитался? Выкинь его


 
Romkin ©   (2004-10-05 12:07) [8]

Digitman ©  (05.10.04 12:06) [6] Мдя... Но получается-то все равно как если таймер сидит в основном потоке :))


 
Digitman ©   (2004-10-05 12:09) [9]


> Romkin ©   (05.10.04 12:07) [8]


да пополам, где он "сидит" ..
это ответ на авторский вопрос, почему таймер не "сигналит"


 
Мирон ©   (2004-10-05 12:24) [10]


>Тут у тебя две грубые ошибки:
> 1. Фактически весь поток состоит из вызова Syncronize.
> Намекаю: функция, которую ты подаешь в этот метод,
>выполняется в контексте основного потока
> 2. Для работы таймера необходим цикл обработки
>сообщений :)
> ТАк я и спрашиваю - а нафига такой поток?!


Просто я выдрал из приведенного кода здровый кусок, чтобы он не отвлекал...

Всем спасибо за ответы, вроде разобрался.

Еще вопрос: В Synchronize отображаются текущие результаты выполнения потока на контролах формы + до фига рисования GDI-ем. Имеет ли смысл вызывать синхронизацию не чаще частоты обновления экрана монитора? Или это уже изврат?


 
Smithson   (2004-10-05 12:52) [11]

100 раз в секунду? Это ИЗВРАТ! Обновлять имеет смысл раз-два в секунду, для критичных событий еще реже.



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
1-1096319571
Black-Grin
2004-09-28 01:12
2004.10.17
Откуда вызывается процедура?


1-1096889517
DelphiLexx
2004-10-04 15:31
2004.10.17
Избавится от моргания ListView


1-1096464141
Gemini
2004-09-29 17:22
2004.10.17
Поиск


1-1096479492
Trim
2004-09-29 21:38
2004.10.17
Работа с TListView


14-1096546298
Zlod3y
2004-09-30 16:11
2004.10.17
Скачать последнюю версию BDE