Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизЗавершение потока Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c