Главная страница
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.49 MB
Время: 0.035 c
3-1088553025
Alexey Leonchik
2004-06-30 03:50
2004.07.25
Перекодировка MS1251 -> KOI8-R


3-1088862357
GanibalLector
2004-07-03 17:45
2004.07.25
ГЕНЕРАТОР


1-1089262808
Артем К.
2004-07-08 09:00
2004.07.25
Можно ли разместить меню не вверху формы, а по своим координатам?


1-1089276204
Sandman25
2004-07-08 12:43
2004.07.25
Флаги или переопределение событий?


3-1088743612
Artem
2004-07-02 08:46
2004.07.25
Вопрос по Update данных в DBGrid