![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно удалить поток [D6]
Олег Лаукарт © (2002-02-05 16:11:00)Есть поток (TThread) задача которого через заданный интервал выполнять заданную последовательность действий. Действия могут выполняться долго, поэтому таймер (TTimer) не подходит.
procedure TMyThread.Execute;
begin
while not Terminated do
try
DoAction;
sleep (Interval);
except end;
end;
Если делаю Terminate (FreeOnTerminate=true), то у потока не вызывается деструктор, а если делаю Free (FreeOnTerminate=false) руками, то поток зависает до окончания sleep.
Как исправить ситуацию?
Олег Лаукарт (2002-02-05 16:45:00) [1]Вариант Алексея Петрова мне кажется лучше чем накручивание пустых циклов. Спасибо, постоянно забываю про этот механизм.
Виктор Щербаков (2002-02-05 16:31:00) [2]Ну если разбить на интервалы примерно по 100, то точно не будет.
Конечно, на выполнение цикла будет тратиться определенное время, но оно, ИМХО, ничтожно, и ни одна программа показывающая загрузку процессора не сможет его измерить, т.к. оно будет меньше ошибки измерения.
Алексей Петров (2002-02-05 16:26:00) [3]Есть вариант:
Заводишь
hTerminateEvent = CreateEvent(nil, False, False, nil);
Вместо Sleep(N) используешь
case WaitForSingleObject(hTerminateEvent, N) of
WAIT_OBJECT_0: // Завершать поток
WAIT_TIMEOUT: // выполнять периодическую работу
end;
Для завершения потока говоришьSetEvent(hTerminateEvent)
panov (2002-02-05 16:25:00) [4]Нет, не будет.
Олег Лаукарт (2002-02-05 16:22:00) [5]Да, интервал 10 и более минут. Тоесть кроме разбиения на более мелкие интервалы и выполнения действия по истечении заданного промежутка времени вариантов нет? Не будет ли при таком подходе загружатся система?
Виктор Щербаков (2002-02-05 16:15:00) [6]Если интервал большой (например >=1000), то
for i := 1 to 100 do
begin
sleep(Interval div 100);
if Terminated then break;
end;