Форум: "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