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

Вниз

Потоки   Найти похожие ветки 

 
Вжик   (2004-06-08 21:20) [0]

Товарищи, помогите ответить на такой вот вопрос: почему после создания, выполнения и завершения некоторого кол-ва потоков менеджер задач показывает что количество потоков остается таким каким было при старте программы, а вот количество открытых хэндлов равняется тому что было при старте по одному на каждый уже отработавший поток. Программа oh.exe для просмотра объектов, которыми владеют процессы, показывает то же самое - огромную кучу якобы ещё выполняемых потоков.

Упрощенный пример, чтобы показать что я имею ввиду:


function ThreadFunc(Dummy : Pointer) : dword; stdcall;
begin
 Sleep(2000); Result:=0;
 
 // следующая строка не меняет ситуации
 // ExitThread(0);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 I, X : dword;
 Threads : array [0..100] of dword;
begin
 for I:=0 to 100 do
   Threads[I]:=CreateThread(nil, 0, @ThreadFunc, @I, 0, X);

 // следующий кусок кода для закрытия открытых хэндлов исправляет ситуацию.
 // но ведь нереально создавать из текущего потока новый, чтобы остановить
 // текущий поток чуть позже и дожидаться выполнения только что созданного
 // потока.

 if WaitForSingleObject(Threads[100], INFINITE) = WAIT_OBJECT_0 then
   for I:=0 to 100 do
     CloseHandle(Threads[I]);
end;


 
YuRock ©   (2004-06-08 21:41) [1]

Потому, что WaitForSingleObject, а не WaitForMultiplyObjects.

А вообще - такое даже и откомпилиться не сможет :|


 
YuRock ©   (2004-06-08 21:42) [2]

Потому, что WaitForSingleObject, а не WaitForMultiplyObjects.

А вообще - такое даже и откомпилиться не сможет :|


 
Вжик   (2004-06-08 21:48) [3]

пфф.. во-первых, это ТЕСТОВЫЙ пример для демонстрации. я мог вообще вместо WaitFor.. воткнуть Sleep(5000). кстати не вижу причин использовать WaitForMultiplyObjects() на последнем завершившемся потоке сработают и та и та функции.

во-вторых, компилится прекрасно.


 
YuRock ©   (2004-06-08 22:02) [4]

Да, извини, компилиться должно - я не доглядел, что ты передаешь 100-ый эл-т массива, а не весь массив :)) Извини еще раз...

> кстати не вижу причин использовать WaitForMultiplyObjects() на последнем завершившемся потоке сработают и та и та функции

Советую посмотреть, что возвращает WaitForSingleObject. Я сомневаюсь, что WAIT_OBJECT_0.


 
Вжик   (2004-06-08 22:07) [5]

>> Вжик   (08.06.04 21:48) [3] пфф.. во-первых, это ТЕСТОВЫЙ пример для демонстрации. я мог вообще вместо WaitFor.. воткнуть Sleep(5000).

суть не в том какие ошибки в тестовом примере и есть ли там они вообще. как бороться с описаной проблемой кроме как создавать эдакий импровизированный менеджер потоков?


 
YuRock ©   (2004-06-08 22:20) [6]

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


 
Вжик   (2004-06-08 22:24) [7]

допустим.. но если взять примеры из хелпа Win32 Programmer"s Reference, то там не оказывается вообще никаких CloseHandle(). как так? и потом, количество потоков после их завершения отображается правильно, неправильно отображается количество открытых хэндлов (это к фразе "Потоки могут не закрываться..")


 
Unax   (2004-06-08 22:36) [8]

Хэндлы надо закрывать.
Если ты их не закроешь они будут открыты до самой "смерти" процесса.
Кстати, в функцию WaitForMultipleObjects можно передать описатели максимум 64 объектов


 
Игорь Шевченко ©   (2004-06-08 23:49) [9]


> но если взять примеры из хелпа Win32 Programmer"s Reference,
> то там не оказывается вообще никаких CloseHandle().


Оказывается. Кроме того, автоматический вызов CloseHandle неявно выполняется системой при завершении процесса, открывшего (явно или неявно) эти Handles.



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

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

Наверх




Память: 0.46 MB
Время: 0.023 c
1-1089310224
limon_
2004-07-08 22:10
2004.07.25
JPEG и масштаб


14-1089014841
Паниковский
2004-07-05 12:07
2004.07.25
Помогите курсовая горит!


9-1081437245
Михаил__
2004-04-08 19:14
2004.07.25
Сообщение


1-1089534069
killer
2004-07-11 12:21
2004.07.25
Вызов одной формы из другой, которые находятся в одной DLL


14-1088668148
Красная Майка
2004-07-01 11:49
2004.07.25
Неофициальное MMP завтра для всех желающих!!!





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