Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Завершение потока [D7, WinXP]


Sergey_R ©   (2005-10-14 14:34:00) 

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


Leonid Troyanovsky   (2005-10-17 16:38:00) [1]


> 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.


TUser   (2005-10-17 16:19:00) [2]

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

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


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


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


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

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

--
Regards, LVT.


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

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


Leonid Troyanovsky   (2005-10-17 16:01:00) [5]


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

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


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

--
Regards, LVT.


Sergey_R   (2005-10-17 15:55:00) [6]

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


Sergey_R   (2005-10-17 15:51:00) [7]

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


Eraser   (2005-10-15 19:04:00) [8]


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

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

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


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

Код в студию.


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

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


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

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

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


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

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


y-soft   (2005-10-14 23:24:00) [12]

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

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

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


Eraser   (2005-10-14 18:53:00) [13]

WaitFor.


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

WaitForSingleObject


TUser   (2005-10-14 17:05:00) [15]

OnTerminate


Digitman   (2005-10-14 15:28:00) [16]


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


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

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


evvcom   (2005-10-14 15:24:00) [17]


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

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


Leonid Troyanovsky   (2005-10-14 15:16:00) [18]


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

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


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

--
Regards, LVT.


Digitman   (2005-10-14 15:08:00) [19]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо