Форум: "Основная";
Текущий архив: 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.033 c