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

Вниз

Threads... (inside)   Найти похожие ветки 

 
Fellomena   (2002-03-20 10:49) [0]

Всем привет ! Объясните мне plz что происходит, когда я из цикла
запускаю поток, цикл заканчивается и программа тоже, а поток всё ещё работает ?
Он ведь по идее должен бцть уничтожен - так ? (программа не в WindowsLoop-е работает).
И в таком случае надо использовать, imho, WaitForSingleObject - так ?
Что бы понятно было о чём речь, код:

...
DO j = 1, count

if (j.EQ.count) then
ThreadHandle = CreateThread(0, 0, MyThread, 0, &
0, ID)
WaitResult = WaitForSingleObject (ThreadHandle, WAIT_INFINITE)
m = CloseHandle (ThreadHandle)
print *, j
EndIf

if (((j.GT.count2) .and. (mod(j,count2).EQ.0)) then

! ...
ThreadHandle = CreateThread(0, 0, MyThread, 0, &
! ... 0, ID)
m = CloseHandle (ThreadHandle)
print *, j
EndIf

End Do
! ...
! процедура, которая запускается в потоке
subroutine MyThread()
use dfmt

print *, "Thread work !!!"
CALL EXITTHREAD(0)
end subroutine

Можно я на Паскаль перебивать не буду - и так всё ясно, imho.
Так вот, при выполнении этого кода значения j выводятся на 1 больше, чем "Thread work !!!" (хотя не всегда)
Почему так ?


 
Fellomena   (2002-03-20 10:49) [1]

sorry - не в тот форум кинула с просони, надо было в Api


 
Digitman ©   (2002-03-20 11:16) [2]

"в таком случае надо использовать ... WaitForSingleObject " - именно так. И не только в таком - в любом случае ! Прежде, чем приложение уйдет на завершение , оно должно дождаться завершения всех запущенных им доп.кодовых потоков (и , если это невозможно по каким-то причинам - терминировать их принудительно).

В Делфи при использовании VCL-объектов TThread (инкапсулирующих ф-ции управления потоком) вызов ф-ции ожидания неявен (он встроен в деструктор класса TThread непосредственно перед разрушением экз-ра TThread, запустившего поток), тем, собственно говоря, и удобен, т.к., не нужно специально заботиться об этом : просто вызвал деструктор экземпляра TThread - и он все необходимое сам сделает.


 
lipskiy ©   (2002-03-20 14:54) [3]


> И не только в таком - в любом случае !


> просто вызвал деструктор экземпляра TThread - и он все необходимое
> сам сделает.

Так надо или не надо?
Вот, я, например, создаю поток, который выполняет не циклическую а линейную операцию и по ее завершении уничтожается (закачка данных с инета). В конце процедуры Execute я просто пишу Terminate. Нужно ли в этом случае использовать WaitForSingleObject?

И еще - как определить, убит ли поток или он продолжает висеть, если никаких визуальных эффектов он делать не должен?


 
Digitman ©   (2002-03-20 15:15) [4]

>>"В конце процедуры Execute я просто пишу Terminate"

Это зачем ? Все, что делает Terminate - взводит флаг Terminated, анализ которого нужен самой же проц-ре Execute как признак того, что ей "пора закругляться" (например, того требует внешний по отн. к дан.потоку поток). Твоя же Execute - сам говоришь - уже завершила предусмотренные ей действия и ничего ей более не нужно.

А вот внешний код, создавший VCL-объект-поток, ничего не знает о том, работает ли еще в интересующий момент времени ОС-объект-поток (управляемый VCL-объектом-потоком) и единственный способ определить завершенность ОС-объекта-потока - вызвать явно WinAPI-ф-цию ожидания (еу же, к примеру, WaitForSingleObject) либо воспользоваться методом TThread.WaitFor либо вызвать TThread.Destroy (в контексте которого все равно будет вызван WaitFor)



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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
7-329
Gelios
2002-01-02 08:41
2002.04.01
Подскажите плз, В чем причина того, что при создании дистрибутива, программа совершенно не реагирует


1-137
Transaero
2002-03-19 12:04
2002.04.01
Как возвести в степень отрицательное число?


1-131
vampire
2002-03-20 21:33
2002.04.01
~CGI~


14-295
UGH|B1ADE
2002-02-18 18:56
2002.04.01
Плиз поможите !


4-361
Serg001
2002-01-30 10:24
2002.04.01
Как узнать классы всех окон, но только родительских