Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];




Вниз

Как правильно удалить поток 


Олег Лаукарт   (2002-02-05 16:11) [0]

Есть поток (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:15) [1]

Если интервал большой (например >=1000), то

for i := 1 to 100 do
begin
sleep(Interval div 100);
if Terminated then break;
end;



Олег Лаукарт   (2002-02-05 16:22) [2]

Да, интервал 10 и более минут. Тоесть кроме разбиения на более мелкие интервалы и выполнения действия по истечении заданного промежутка времени вариантов нет? Не будет ли при таком подходе загружатся система?



panov   (2002-02-05 16:25) [3]

Нет, не будет.



Алексей Петров   (2002-02-05 16:26) [4]

Есть вариант:
Заводишь
hTerminateEvent = CreateEvent(nil, False, False, nil);

Вместо Sleep(N) используешь

case WaitForSingleObject(hTerminateEvent, N) of
WAIT_OBJECT_0: // Завершать поток
WAIT_TIMEOUT: // выполнять периодическую работу
end;


Для завершения потока говоришь SetEvent(hTerminateEvent)



Виктор Щербаков   (2002-02-05 16:31) [5]

Ну если разбить на интервалы примерно по 100, то точно не будет.

Конечно, на выполнение цикла будет тратиться определенное время, но оно, ИМХО, ничтожно, и ни одна программа показывающая загрузку процессора не сможет его измерить, т.к. оно будет меньше ошибки измерения.



Олег Лаукарт   (2002-02-05 16:45) [6]

Вариант Алексея Петрова мне кажется лучше чем накручивание пустых циклов. Спасибо, постоянно забываю про этот механизм.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.015 c
1-66506           IronHawk              2002-02-04 13:06  2002.02.21  
Приветствую Мастеров ! Проблемы с QuickRep.Preview


1-66525           MystiX                2002-02-05 18:34  2002.02.21  
Help!!!


6-66637           Alex2                 2001-12-04 15:00  2002.02.21  
Способы выполнения команд на Unix-хосте


1-66528           Socol                 2002-02-07 04:18  2002.02.21  
Dll


1-66547           EsKor                 2002-02-05 10:48  2002.02.21  
Передача объектов в процедуру/функцию