Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Вниз

Освободить поток который находится в Suspend   Найти похожие ветки 

 
Nil   (2008-01-15 17:34) [0]

Запускаю поток так:

 ScanThread := TScanThread.Create(True);
 ScanThread.Priority := tpNormal;
 ScanThread.FreeOnTerminate:=True;
 ScanThread.Resume;
 ScanThread.OnTerminate:=FOnTerminate;

потом по кнопке его работа останавливается:
 ScanThread.Suspend;

и если теперь сделать ScanThread.Free, то поток продолжает свою работу только уже не вкачестве а потока а вешает приложение и доделывает то что не доделал.

подскажите как правильно осовободить поток находящийся в Suspend

заранее благодарен


 
DVM ©   (2008-01-15 17:37) [1]


> ScanThread.FreeOnTerminate:=True;

Зачем это тебе сдалось?


 
Игорь Шевченко ©   (2008-01-15 17:47) [2]


> подскажите как правильно осовободить поток находящийся в
> Suspend


Очевидно вывести его из этого состояния вызовом Resume ?


 
Nil   (2008-01-15 18:01) [3]


> > ScanThread.FreeOnTerminate:=True;
>
> Зачем это тебе сдалось?

Я так понимаю без этого нужно делать Free вручную? или не прав?


> > подскажите как правильно осовободить поток находящийся
> в
> > Suspend
>
>
> Очевидно вывести его из этого состояния вызовом Resume ?
>

нужно не продолжить, а именно освободить все ресурсы которые были в этом потоке взяты и заврешить его


 
han_malign ©   (2008-01-15 18:02) [4]

MSDN - SuspendThread:
This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization.


 
Сергей М. ©   (2008-01-15 19:50) [5]

Удалено модератором


 
Nil   (2008-01-15 20:31) [6]

Удалено модератором


 
Nil   (2008-01-15 20:33) [7]


> Ты где этого гна наелся ?

это гно написал человек, знания которого ты даже в своих снах не увидишь!
смотри сюда, чудо:

Программирование в Delphi 7
ID товара: 23532
Издательство: BHV
Серия: Мастер программ
Жанр: Информатика и техника, Книги для профессионалов
Год выпуска: 2003
Страниц: 784
Автор: Дарахвелидзе Петр, Марков Евгений
Тип обложки: обл - мягкий переплет (крепление скрепкой или клеем)
Масса: 682 г
Размеры: 235x165x30 мм
ISBN: 5-94157-116-Х
Наличие: Отсутствует

Подскажите пож, знающие люди, как всё таки правильно завершить поток, если он ещё не закончил свою работу.


 
Palladin ©   (2008-01-15 20:37) [8]

Даже вкусные вещи можно жрать мордой...
Предварительное завершение потока должно учитываться и корректно обрабатываться в методе execute и исполнятся вызовом метода terminate... жестокое обрывание жизни потока можно сделать через TerminateThread, но ни к чему хорошему это обычно не приводит


 
Nil   (2008-01-15 20:57) [9]


> Даже вкусные вещи можно жрать мордой...

вроде сделал всё именно так как там написано, вроде скушал правильно. просто там о вопросе завершения потока мало что написано

а terminate же вроде только выстанавливает terminated в true? всё остальное нужно руками прерывать и корректно всё освобождать? это получается единственный путь?

а TerminateThread ресурсы освобождает которые были заняты в ходе работы потока? это же просто убивает сам процесс но не то что он там наделал? или опять ошибаюсь?


 
_Mike_   (2008-01-15 21:16) [10]

To nil.

Если поток делает что-то в цикле - то Terminated вполне так, типа
while not Terminated
однако каждая итерация цикла должна занимать мало времени, чтобы реакция на завршение была адекватна.

Если поток что-то ждет, то лучше всего использовать Event (события), которое и ожидать в потоке. И если оно Signaled (хз как перевести) - то выходить из Execute. Ну типа так
TMyThread = class(TThread)
private
 FEvent: THandle;
protected
 procedure Execute; override;
public
 constructor Create(Event: THandle);
end;

constructor TMyThread.Create(Event: THandle);
begin
 FEvent := Event; // Here you may create named event and use OpenEvent without passing the event handle as parameter and storing it in the local fields.
 // Here set up all other properties and local fields as needed.
 FreeOnTerminate := False; // Strongly recomended to manage the thread by hands in this case
 inherited Create(False); // Start the thread immediately
end;

procedure TMyThread.Execute;
var
 Events: array [0..1] of THandle;
begin
 Events[0] := FEvent;
 Events[1] := FileHande; // Let say the thread waits the overlapped operation
 while True do  
   if WaitForMultipleObjects(2, @Events, False, INFINITE) = WAIT_OBJECT_0 then
     Break // Terminate thread by the main thread
   else begin
     // Do what you need here
   end;
end;


 
DVM ©   (2008-01-15 22:59) [11]


> Я так понимаю без этого нужно делать Free вручную? или не
> прав?

Надо делать Terminate, потом ждать завершения, потом Free.


 
Palladin ©   (2008-01-16 09:33) [12]


> а terminate же вроде только выстанавливает terminated в
> true? всё остальное нужно руками прерывать и корректно всё
> освобождать? это получается единственный путь?

это единственно правильный путь


> а TerminateThread ресурсы освобождает которые были заняты
> в ходе работы потока? это же просто убивает сам процесс
> но не то что он там наделал? или опять ошибаюсь?

конечно же не освобождает, просто прекращает жизнь потока, да и не всегда удачно... все что ты взял, создал объекты, выделил память, останется... даже, АФАИК, объкты ядра, взятые в процессе работы потока, но не связанные с ним (сам поток изничтожится), занятыми останутся до конца жизни процесса, а некоторые даже до завершения работы системы... у Рихтера подробно расписаны и другие нюансы жестокости убийства...


 
Leonid Troyanovsky ©   (2008-01-16 12:19) [13]


> DVM ©   (15.01.08 22:59) [11]

> Надо делать Terminate, потом ждать завершения, потом Free.

From classes.pas:

destructor TThread.Destroy;
begin
 if (FThreadID <> 0) and not FFinished then
 begin
   Terminate;
   if FCreateSuspended then
     Resume;
   WaitFor;
 end;
..

--
Regards, LVT.


 
Nil   (2008-01-17 12:17) [14]

спасибо, вроде разобрался



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

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

Наверх




Память: 0.48 MB
Время: 0.052 c
15-1199931425
дучф_ч
2008-01-10 05:17
2008.02.10
ошибка при открытии Progecta


15-1199714934
Parus
2008-01-07 17:08
2008.02.10
PHP: register_shutdown_function для рекламы


6-1179287240
-=Germe$=-
2007-05-16 07:47
2008.02.10
HTTP запрос средствами WinSock


2-1200765332
iiiymaxep
2008-01-19 20:55
2008.02.10
Окна


2-1200297813
dumka
2008-01-14 11:03
2008.02.10
Проигрыватель





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