Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.05 c
14-1128692981
oldman
2005-10-07 17:49
2005.11.06
Старая задачка (пятница все-таки)


6-1121929019
Profik
2005-07-21 10:56
2005.11.06
WinMessenger


14-1129531258
Маг Похмеляйнен
2005-10-17 10:40
2005.11.06
Просьба проверить баг в Borland C++ Builder 6


4-1125771215
GuAV
2005-09-03 22:13
2005.11.06
Сшная структура из MSDN - как понимать такие поля ?


14-1129006311
pazitron_brain
2005-10-11 08:51
2005.11.06
Какой Linux выбрать?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский