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

Вниз

Завершение потока   Найти похожие ветки 

 
Sergey_R ©   (2005-10-14 14:34) [0]

А как можно узнать, что поток завершил свою работу? Просто мне нужно обрабатывать данные после того, как поток завершил свою работу!


 
Digitman ©   (2005-10-14 15:08) [1]

поток как объект ОС будучи созданным имеет хэндл.

пока этот хэндл актуален (не закрыт), он (точнее - его значение) может быть использован в кач-ве факт.параметра в любой ф-ции ожидания сигналов объектов синхронизации


 
Leonid Troyanovsky ©   (2005-10-14 15:16) [2]


> Digitman ©   (14.10.05 15:08) [1]

> поток как объект ОС будучи созданным имеет хэндл.
> пока этот хэндл актуален (не закрыт),


Пока объект существует, т.е. пока не закрыт последний его хендл ..

--
Regards, LVT.


 
evvcom ©   (2005-10-14 15:24) [3]


> А как можно узнать, что поток завершил свою работу?

Что подразумевается под "потоком"? Если объект ОС, то в [1] и [2] уже содержатся ответы. Если же это объект класса TThread, то в классе имеется Event OnTerminate.


 
Digitman ©   (2005-10-14 15:28) [4]


> Leonid Troyanovsky ©   (14.10.05 15:16) [2]
> Пока объект существует, т.е. пока не закрыт последний его
> хендл


ну бог с ним, пусть будет так ...

я упростил ситуацию, в предположении что автору сие - подсчет ссылок - вообще неведомо.


 
TUser ©   (2005-10-14 17:05) [5]

OnTerminate


 
GLFox ©   (2005-10-14 17:13) [6]

WaitForSingleObject


 
Eraser ©   (2005-10-14 18:53) [7]

WaitFor.


 
y-soft ©   (2005-10-14 23:24) [8]

Почему-то никто не упомянул общий способ определения выполняется ли в данный момент функция потока, описатель которого известен, с помощью функции GetExitCodeThread

Применительно к TThread:

function IsThreadRunning(Thread : TThread) : boolean;
var
 Ret : DWORD;
begin
 if GetExitCodeThread(Thread.Handle, Ret) then
   Result := Ret = STILL_ACTIVE
 else
   RaiseLastWin32Error;
end;


 
y-soft ©   (2005-10-15 00:51) [9]

Пардон, правильно так:

function IsThreadRunning(Thread : TThread) : boolean;
var
Ret : DWORD;
begin
Result := GetExitCodeThread(Thread.Handle, Ret) and (Ret = STILL_ACTIVE);
end;


Предыдущий вариант не учитывал ситуации, когда  хендл потока недействителен (такое случится, если установлено TThread.FreeOnTerminate := True, а функция потока уже завершена)...

Надо бы еще анализировать код ошибки в случае неудачи GetExitCodeThread, но в подавляющем числе случаев это будет сообщение о том, что переданный в функцию описатель потока недействителен, что равносильно тому, что функция потока не выполняется...


 
Sergey_R ©   (2005-10-15 16:55) [10]

С завершением потока вроде бы разобрался. А как приостановить или отменить работу потока? Я создал форму, куда кинул ProgressBar и две кнопки. В OnClick первой кнопки написал Thread.Suspend а во второй Thread.Terminate. Запускаю прогу, прогрессбар считает проценты, а кнопки не работают. Если компилировать прогу из Дельфи то при нажатии на любую из кнопок вываливается ошибка AccessViolation, а если запускать готовый exe"шник то выводит ту же ошибку, хотя поток продолжает свою работу! В чем может быть проблема?


 
Poirot ©   (2005-10-15 17:00) [11]

Код в студию.


 
Eraser ©   (2005-10-15 19:04) [12]


> Sergey_R ©   (15.10.05 16:55) [10]

>  А как приостановить или отменить работу потока?

Лучше из самого потока, т.е. Thread.Terminate, а поток должен отслеживать св-во Terminated.


 
Sergey_R ©   (2005-10-17 15:51) [13]

С работой кнопок во время работы потока я разобрался. Все оказалось гораздо проще! В Button1.Click был var в котором был объявлен поток с таким же именем, как и глобальный. При щелчке на кнопке останавливается локальный поток, хотя он и не создан!


 
Sergey_R ©   (2005-10-17 15:55) [14]

А вот еще один глюк обнаружил. Допустим, прога просканировала все тэги, соответственно поток завершил свою работу. При щелчке на кнопке ПАУЗА вылазит ошибка, что поток заквершил работу! То есть и для кнопки нужно проверять, работает ли до сих пор поток или нет? Пытался в коде потока ввести переменную boolean, куда писать работает ли поток или нет, но что-то не получается... Может проще сделать через событие OnTerminate? И если да, то как?


 
Leonid Troyanovsky ©   (2005-10-17 16:01) [15]


> Sergey_R ©   (17.10.05 15:55) [14]

> не получается... Может проще сделать через событие OnTerminate?
>  И если да, то как?


Действительно, в OnTerminate.
ButtonX.Enabled := True.

--
Regards, LVT.


 
Sergey_R ©   (2005-10-17 16:11) [16]

А как создать событие OnTerminate, если у меня нет формы, соответственно инспектора объектов? В класс потока дописывать? И как потом описывать в тексте программы?


 
Leonid Troyanovsky ©   (2005-10-17 16:18) [17]


> Sergey_R ©   (17.10.05 16:11) [16]
> А как создать событие OnTerminate, если у меня нет формы,
>  соответственно инспектора объектов? В класс потока дописывать?
>  И как потом описывать в тексте программы?


А куда оно (вместе с инспектором) вдруг пропало?
Может у тебя консольное приложение?

С другой стороны, три дня развлечений.
Т.е., сам себе - злобный Буратино.

--
Regards, LVT.


 
TUser ©   (2005-10-17 16:19) [18]

> А как создать событие OnTerminate, если у меня нет формы, соответственно инспектора объектов?

YourThread.OnTerminate:=процедура,
где процедура описана, например, как
TYourClass.Proc (Sender: TObject);


 
Leonid Troyanovsky ©   (2005-10-17 16:38) [19]


> TUser ©   (17.10.05 16:19) [18]
> > А как создать событие OnTerminate, если у меня нет формы,
>  соответственно инспектора объектов?
>
> YourThread.OnTerminate:=процедура,
> где процедура описана, например, как
> TYourClass.Proc (Sender: TObject);


А, я понял :)
Автор любопытствовал где в юните, пользующем поток, описать обработчик.

2Sergey_R ©

В оном юните (формы) описать в разделе private (класса формы)
procedure MyThreadTerminate(Sender: TObject);

в имплементации которой и расписать требуемые действия.

При создании же MyThread назначить ему OnTerminate := MyThreadTerminate.

--
Regards, LVT.



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

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.041 c
14-1129553300
ZeroDivide
2005-10-17 16:48
2005.11.06
Вопрос по оптимальному выбору видеокарты для старого железа.


4-1125583313
AngelFire
2005-09-01 18:01
2005.11.06
Получение уровня привелегий процесса


1-1129182769
Andruid
2005-10-13 09:52
2005.11.06
Алгоритм простейшего элемента нейросетей - компаратора


5-1108489947
Anatoly
2005-02-15 20:52
2005.11.06
Поле элемента коллекции - элемент другой коллекции


1-1129528210
Карелин Артем
2005-10-17 09:50
2005.11.06
Как сохранить/считать свойства потомка TObject в строку?