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

Вниз

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

 
}{ander ©   (2004-08-19 13:13) [0]

Создаем процесс CreateProcess, затем вызываем WaitForSingleObject, дожидаемся завершения его выполнения. После этого, для освобождения ресурсов, необходимо сделать CloseHandle для процесса и его первичного потока. Вопрос: а зачем, собственно, вызывать
CloseHandle(PROCESS_INFORMATION.hProcess), если уже вызван
CloseHandle(PROCESS_INFORMATION.hThread)? Если поток в процессе единственный и он завершен, т.е. в процессе не остается ни одного потока, он должен быть завершен, ибо цитата из Рихтера:
«В такай ситуации [когда все протоки процесса уходят] операционная система не считает нужным «содержать» адрессное пространство данного процесса. Обнаружив, что в процессе не исполняется ни один поток, она немедленно завершает его…»
Так вот: если процесс уже завершен, то зачем вызвать для него CloseHandle?


 
Игорь Шевченко ©   (2004-08-19 13:18) [1]


> Так вот: если процесс уже завершен, то зачем вызвать для
> него CloseHandle?


CloseHandle не завершает процесс, а удаляет ссылку на него. Когда общее количество ссылок станет равно нулю, объект удалится из системы. К завершению и прочему это не имеет никакого отношения.


 
}{ander ©   (2004-08-19 13:22) [2]


> CloseHandle не завершает процесс, а удаляет ссылку на него.

Это понятно :-) Вопрос вызван именно цитатой: "она немедленно завершает его (процесс)". Означает ли она, что после подобного завершения обратиться к статистике процесса уже нельзя (хоте бы для того, что получить ExitCode)?
Повторюсь еще раз: не совсем понимаю, что у Рихтера подразумевается под тем, что винда немедленно завершает проыесс? - закрывает хендл, выгружает из памяти, уменьшает колличество ссылок на 1 и т.д....


 
Digitman ©   (2004-08-19 13:24) [3]


> а зачем, собственно, вызывать
> CloseHandle(PROCESS_INFORMATION.hProcess), если уже вызван
>
> CloseHandle(PROCESS_INFORMATION.hThread)?


контрвопрос : а зачем, собственно, вызывать CloseHandle(PROCESS_INFORMATION.hThread), если нормальным и штатным всегда был вызов именно CloseHandle(PROCESS_INFORMATION.hProcess) ?


 
}{ander ©   (2004-08-19 13:30) [4]


>
> контрвопрос : а зачем, собственно, вызывать CloseHandle(PROCESS_INFORMATION.hThread),
> если нормальным и штатным всегда был вызов именно CloseHandle(PROCESS_INFORMATION.hProcess)
> ?

Рихтер, Глава 4 "Дочерние процессы" (стр. 81)


 
Fay ©   (2004-08-19 13:32) [5]

Опять "Рихтер"...
Рихтер, Глава 4 - это "Программы управления службами" 8)


 
}{ander ©   (2004-08-19 13:36) [6]

2 Fay

Рихтер. Windows для профессионалов. Издание четвертое. Часть 2. Глава 4 - Процессы. Раздел - Дочерние процессы.


 
Digitman ©   (2004-08-19 13:37) [7]


> }{ander ©   (19.08.04 13:30) [4]


тебе зачем вообще hThread понадобился ?

ну hProcess - это я понимаю : тебе нужно синхронизироваться с моментом завершения процесса, коль скоро ты его, к примеру, создал ... а hThread-то зачем получал ?


 
Digitman ©   (2004-08-19 13:39) [8]

вернее, не получал (коль скоро тебе его вернула ф-ция без твоей воли), а интерес к нему проявил ?


 
}{ander ©   (2004-08-19 13:51) [9]


> Digitman ©   (19.08.04 13:39) [8]
> вернее, не получал (коль скоро тебе его вернула ф-ция без
> твоей воли), а интерес к нему проявил ?

hThread мне не нужен. Вопрос в том, зачем, в принципе вызывать CloseHandle для процесса, если при закрытии всех потоков этот самый процесс завершается виндой?


 
Игорь Шевченко ©   (2004-08-19 14:36) [10]


> Вопрос в том, зачем, в принципе вызывать CloseHandle для
> процесса, если при закрытии всех потоков этот самый процесс
> завершается виндой?


См. [1]


 
}{enon ©   (2004-08-19 15:48) [11]

<off>
А теперь повторили все по второму кругу! :)
</off>


 
}{enon ©   (2004-08-19 15:48) [12]

Удалено модератором


 
Мастер ©   (2004-08-19 15:56) [13]

Проведи простой эксперимент.

В программе по нажатию кнопки создавай новый процесс, но не выполняй CloseHandle для процесса и/или потока.
Одновременно в менеджере задач последи за количеством открытых дескрипторов для твоего приложения.

Сравни результаты при выполннении CloseHandle и без него.

И подумай, что количество открытых дескрипторов ограничивается системой для твоего приложения.


 
}{ander ©   (2004-08-19 17:26) [14]

Спасибо всем. Разобрался. Налицо было не совсем точное понимание разницы между процессом и его хэндлом. Хотелось бы только еще уточнить один вопрос по [3]:

> контрвопрос : а зачем, собственно, вызывать CloseHandle(PROCESS_INFORMATION.hThread),
> если нормальным и штатным всегда был вызов именно CloseHandle(PROCESS_INFORMATION.hProcess)
> ?

Поток – это объект ядра. Закрывая хэндл процесса, мы никоим образом не закрываем хэндл его первичного потока. Стало быть, ресурсы, выделенные под него, не будут освобождены до тех пор, пока мы его явно не закроем (хэндл потока) или пока не завершится приложение, вызвавшее создание дочернего процесса (в этом случае ОС его освободит). Поэтому, имхо, вызывать CloseHandle(PROCESS_INFORMATION.hThread) все-таки нужно, если мы хотим освободить ресурсы. Или я не прав?


 
Мастер ©   (2004-08-19 17:38) [15]

>}{ander ©   (19.08.04 17:26) [14]
все-таки нужно, если мы хотим освободить ресурсы. Или я не прав?

Совершенно точно - прав.


 
Digitman ©   (2004-08-20 08:20) [16]


> }{ander ©   (19.08.04 17:26) [14]


логично. ты прав.



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

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

Наверх





Память: 0.49 MB
Время: 0.049 c
1-1094724867
Pashkerton
2004-09-09 14:14
2004.09.26
Mutex handle


1-1094484496
Настенька
2004-09-06 19:28
2004.09.26
кнопка Пуск


14-1094133108
sesh
2004-09-02 17:51
2004.09.26
Красивые кнопенции, эдиты и т.д.


1-1094876204
O?O
2004-09-11 08:16
2004.09.26
Преобразование символов в строке


1-1094835975
Pers
2004-09-10 21:06
2004.09.26
ListBox





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