![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
не работает 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]ДА как тебе сказать... А зачем тебе поток-то вообще? Судя по коду - он нафиг не нужен ;)