2015-06-25 3 views
-3

В Windows я использую CreateEvent или OpenEvent для использования объекта события, но я не могу найти способ удалить объект, когда я закончил с ним. Нужно ли его удалять? Если да, то как мне это сделать?Почему нет функции для удаления события?

+4

CloseHandle https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211%28v=vs.85%29.aspx – deviantfan

ответ

1

Большинство объектов ядра (включая объекты событий) подсчитываются по ссылке, поэтому их не нужно явно удалять. Когда последний дескриптор объекта закрыт, объект автоматически удаляется.

Примечание:

  • Там нет никакого способа, чтобы заставить объект ядра должны быть удалено, кроме закрывая ручку (ы).

  • Ручки относятся к процессу, который их открывает, а не к потоку. Они могут использоваться из любого потока и не закрываются автоматически, если поток, который их открыл, выходит.

  • Когда вы запускаете дочерний процесс, у ребенка есть возможность наследовать дескрипторы родительского процесса. Если этот параметр включен, то любые объекты ядра, которые ваш процесс был открыт во время запуска дочернего элемента, не будут удалены, пока ребенок не выйдет. (Если, конечно, ребенок явно не закрывает ручки, обычно это невозможно, потому что ребенок даже не знает, что существуют ручки.)

    Если вам нужен ваш дочерний процесс для наследования определенных ручек, настоятельно рекомендуется, чтобы вы используйте параметр PROC_THREAD_ATTRIBUTE_HANDLE_LIST, чтобы ребенок наследовал только те дескрипторы, которые вы явно указываете. Например, вы можете использовать это, если вам нужно перенаправить стандартный ввод и вывод. Если вам не нужны какие-либо ручки для наследования, убедитесь, что вы передали FALSE в параметр bInheritHandles.

  • Если вы будете использовать объект на протяжении всего срока службы, вам не нужно закрывать ручку; он автоматически закрывается, когда процесс завершается, и соответствующий объект удаляется, если никакой другой процесс не имеет к нему дескриптора.

  • В качестве исключения из общего правила объекты процесса и объекты потоков будут удаляться только после того, как все дескрипторы закрыты. и завершен соответствующий процесс или поток.

1

Нет, вам не нужно , чтобы удалить мероприятие. Как упоминалось в комментариях @deviantfan, вы можете использовать CloseHandle, чтобы сигнализировать, что вы сделали это с объектом, но это необязательно. От MSDN CreateEvent (внимание мое):

Используйте функцию CloseHandle, чтобы закрыть ручку. Система автоматически закрывает ручку, когда процесс завершается. Объект события уничтожается, когда его последний дескриптор был закрыт.