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

Вниз

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

 
Вжик   (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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.04 c
6-1085612967
Viner
2004-05-27 03:09
2004.07.25
Проверка почты


1-1089232054
killer
2004-07-08 00:27
2004.07.25
В Edit только числа...


6-1085580515
cherrex
2004-05-26 18:08
2004.07.25
FTP Server


1-1089640774
Горыныч
2004-07-12 17:59
2004.07.25
Как получить тотальный контроль над консольным приложением


4-1086467408
AndreySoft
2004-06-06 00:30
2004.07.25
Как запретить нажатие клавиши "WINDOWS"





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