![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки [D5, Win2k]
Вжик © (2004-06-08 21:20:00)Товарищи, помогите ответить на такой вот вопрос: почему после создания, выполнения и завершения некоторого кол-ва потоков менеджер задач показывает что количество потоков остается таким каким было при старте программы, а вот количество открытых хэндлов равняется тому что было при старте по одному на каждый уже отработавший поток. Программа 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;
Игорь Шевченко (2004-06-08 23:49:00) [1]
> но если взять примеры из хелпа Win32 Programmer's Reference,
> то там не оказывается вообще никаких CloseHandle().
Оказывается. Кроме того, автоматический вызов CloseHandle неявно выполняется системой при завершении процесса, открывшего (явно или неявно) эти Handles.
Unax (2004-06-08 22:36:00) [2]Хэндлы надо закрывать.
Если ты их не закроешь они будут открыты до самой "смерти" процесса.
Кстати, в функцию WaitForMultipleObjects можно передать описатели максимум 64 объектов
Вжик (2004-06-08 22:24:00) [3]допустим.. но если взять примеры из хелпа Win32 Programmer's Reference, то там не оказывается вообще никаких CloseHandle(). как так? и потом, количество потоков после их завершения отображается правильно, неправильно отображается количество открытых хэндлов (это к фразе "Потоки могут не закрываться..")
YuRock (2004-06-08 22:20:00) [4]Потоки могут не закрываться только потому, что не была вызвана ф-ция CloseHandle
Вжик (2004-06-08 22:07:00) [5]>> Вжик (08.06.04 21:48) [3] пфф.. во-первых, это ТЕСТОВЫЙ пример для демонстрации. я мог вообще вместо WaitFor.. воткнуть Sleep(5000).
суть не в том какие ошибки в тестовом примере и есть ли там они вообще. как бороться с описаной проблемой кроме как создавать эдакий импровизированный менеджер потоков?
YuRock (2004-06-08 22:02:00) [6]Да, извини, компилиться должно - я не доглядел, что ты передаешь 100-ый эл-т массива, а не весь массив :)) Извини еще раз...
> кстати не вижу причин использовать WaitForMultiplyObjects() на последнем завершившемся потоке сработают и та и та функции
Советую посмотреть, что возвращает WaitForSingleObject. Я сомневаюсь, что WAIT_OBJECT_0.
Вжик (2004-06-08 21:48:00) [7]пфф.. во-первых, это ТЕСТОВЫЙ пример для демонстрации. я мог вообще вместо WaitFor.. воткнуть Sleep(5000). кстати не вижу причин использовать WaitForMultiplyObjects() на последнем завершившемся потоке сработают и та и та функции.
во-вторых, компилится прекрасно.
YuRock (2004-06-08 21:42:00) [8]Потому, что WaitForSingleObject, а не WaitForMultiplyObjects.
А вообще - такое даже и откомпилиться не сможет :|
YuRock (2004-06-08 21:41:00) [9]Потому, что WaitForSingleObject, а не WaitForMultiplyObjects.
А вообще - такое даже и откомпилиться не сможет :|