Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

Освободить поток который находится в 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
2-1200304324
гость
2008-01-14 12:52
2008.02.10
получение всех точек дуги (arc)


2-1200855531
aha
2008-01-20 21:58
2008.02.10
Где можно прочитать про формат IEEE , дело в том , что дивайс


15-1199903664
@!!ex
2008-01-09 21:34
2008.02.10
Какой БП нужен?


15-1199474210
NaNo
2008-01-04 22:16
2008.02.10
Длина взаимного перекрытия двух отрезков


2-1200578388
cosinus
2008-01-17 16:59
2008.02.10
Почему не работает конструкция?