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

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

не работает Timer в отдельном потоке


Мирон ©   (2004-10-05 11:51:00) 

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

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


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

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


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


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


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

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

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


Digitman   (2004-10-05 12:09:00) [3]


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


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


Romkin   (2004-10-05 12:07:00) [4]

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


Digitman   (2004-10-05 12:06:00) [5]

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:00) [6]

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


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

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


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

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


DiamondShark   (2004-10-05 12:04:00) [9]

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


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

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

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


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

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


Наверх

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