Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];

Вниз

не работает 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.034 c
8-1090602215
zlo_inside
2004-07-23 21:03
2004.10.17
Загрузить и нарисовать изображение в PNG


4-1095389264
BorisMor
2004-09-17 06:47
2004.10.17
Окно без бордюра, но ресайзится.


3-1095156533
O?O
2004-09-14 14:08
2004.10.17
Инсталирован BDE или нет


4-1094845471
Зяц
2004-09-10 23:44
2004.10.17
Консоль и GUI двойной удар


1-1096838397
Charly22
2004-10-04 01:19
2004.10.17
Кнопки ToolBar a и пункты меню





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский