![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освободить поток который находится в Suspend
Nil © (2008-01-15 17:34:00)Запускаю поток так:
ScanThread := TScanThread.Create(True);
ScanThread.Priority := tpNormal;
ScanThread.FreeOnTerminate:=True;
ScanThread.Resume;
ScanThread.OnTerminate:=FOnTerminate;
потом по кнопке его работа останавливается:
ScanThread.Suspend;
и если теперь сделать ScanThread.Free, то поток продолжает свою работу только уже не вкачестве а потока а вешает приложение и доделывает то что не доделал.
подскажите как правильно осовободить поток находящийся в Suspend
заранее благодарен
Nil (2008-01-17 12:17:00) [1]спасибо, вроде разобрался
Leonid Troyanovsky (2008-01-16 12:19:00) [2]
> 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.
Palladin (2008-01-16 09:33:00) [3]
> а terminate же вроде только выстанавливает terminated в
> true? всё остальное нужно руками прерывать и корректно всё
> освобождать? это получается единственный путь?
это единственно правильный путь
> а TerminateThread ресурсы освобождает которые были заняты
> в ходе работы потока? это же просто убивает сам процесс
> но не то что он там наделал? или опять ошибаюсь?
конечно же не освобождает, просто прекращает жизнь потока, да и не всегда удачно... все что ты взял, создал объекты, выделил память, останется... даже, АФАИК, объкты ядра, взятые в процессе работы потока, но не связанные с ним (сам поток изничтожится), занятыми останутся до конца жизни процесса, а некоторые даже до завершения работы системы... у Рихтера подробно расписаны и другие нюансы жестокости убийства...
DVM (2008-01-15 22:59:00) [4]
> Я так понимаю без этого нужно делать Free вручную? или не
> прав?
Надо делать Terminate, потом ждать завершения, потом Free.
_Mike_ (2008-01-15 21:16:00) [5]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;
Nil (2008-01-15 20:57:00) [6]
> Даже вкусные вещи можно жрать мордой...
вроде сделал всё именно так как там написано, вроде скушал правильно. просто там о вопросе завершения потока мало что написано
а terminate же вроде только выстанавливает terminated в true? всё остальное нужно руками прерывать и корректно всё освобождать? это получается единственный путь?
а TerminateThread ресурсы освобождает которые были заняты в ходе работы потока? это же просто убивает сам процесс но не то что он там наделал? или опять ошибаюсь?
Palladin (2008-01-15 20:37:00) [7]Даже вкусные вещи можно жрать мордой...
Предварительное завершение потока должно учитываться и корректно обрабатываться в методе execute и исполнятся вызовом метода terminate... жестокое обрывание жизни потока можно сделать через TerminateThread, но ни к чему хорошему это обычно не приводит
Nil (2008-01-15 20:33:00) [8]
> Ты где этого гна наелся ?
это гно написал человек, знания которого ты даже в своих снах не увидишь!
смотри сюда, чудо:
Программирование в Delphi 7
ID товара: 23532
Издательство: BHV
Серия: Мастер программ
Жанр: Информатика и техника, Книги для профессионалов
Год выпуска: 2003
Страниц: 784
Автор: Дарахвелидзе Петр, Марков Евгений
Тип обложки: обл - мягкий переплет (крепление скрепкой или клеем)
Масса: 682 г
Размеры: 235x165x30 мм
ISBN: 5-94157-116-Х
Наличие: Отсутствует
Подскажите пож, знающие люди, как всё таки правильно завершить поток, если он ещё не закончил свою работу.
Nil (2008-01-15 20:31:00) [9]Удалено модератором
Сергей М. (2008-01-15 19:50:00) [10]Удалено модератором
han_malign (2008-01-15 18:02:00) [11]MSDN - SuspendThread:
This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization.
Nil (2008-01-15 18:01:00) [12]
> > ScanThread.FreeOnTerminate:=True;
>
> Зачем это тебе сдалось?
Я так понимаю без этого нужно делать Free вручную? или не прав?
> > подскажите как правильно осовободить поток находящийся
> в
> > Suspend
>
>
> Очевидно вывести его из этого состояния вызовом Resume ?
>
нужно не продолжить, а именно освободить все ресурсы которые были в этом потоке взяты и заврешить его
Игорь Шевченко (2008-01-15 17:47:00) [13]
> подскажите как правильно осовободить поток находящийся в
> Suspend
Очевидно вывести его из этого состояния вызовом Resume ?
DVM (2008-01-15 17:37:00) [14]
> ScanThread.FreeOnTerminate:=True;
Зачем это тебе сдалось?