Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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]

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.45 MB
Время: 0.004 c
1-66587
Brand
2002-02-06 00:34
2002.02.21
Автозагрузка через реестр, SysTray


1-66609
Abel
2002-02-06 14:04
2002.02.21
unicode и RichEdit


14-66674
Volk
2002-01-04 12:32
2002.02.21
Помогите!!!


14-66661
Snake2000
2001-12-31 16:16
2002.02.21
НОВЫЙ ГОД СКОРО!


14-66663
SV
2001-12-31 19:46
2002.02.21
Hz





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