Форум: "Начинающим";
Текущий архив: 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.046 c