Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.006 c
1-178
ПиВО!!
2002-03-18 22:40
2002.04.01
Присвоение пунктам меню свои события...


3-47
ТеньЛуны
2002-03-07 12:12
2002.04.01
Oracle


1-240
lipskiy
2002-03-20 20:32
2002.04.01
TThread


4-345
Di_wind
2002-01-30 20:20
2002.04.01
TerminateProccess


1-207
tovSuhov
2002-03-20 12:29
2002.04.01
Опять фокус с фокусом...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский