Состояние гонки с счетчиками производительности для текущего процесса

Я пытаюсь обойти старую проблему " Как получить счетчик производительности Windows для текущего процесса". По сути, я перечисляю экземпляры Process Object, чтобы получить список объектов Process, которые затем я могу запросить по их идентификатору процесса и сравнить с моим собственным.

На основании этого я могу построить путь счетчика производительности, используя правильный индекс экземпляра (чтобы создать нечто подобное \Process(my_program#3)\<counter>) что я могу затем использовать для запроса любого интересующего его счетчика. Но что произойдет, если один или несколько других экземпляров my_program завершат работу перед вызовом PdhAddCounter? Если я правильно понимаю, это будет означать, что мой встречный путь теперь относится к другому процессу или теперь неверен. Они могут даже исчезнуть при запросе идентификатора процесса...

Как сделать так, чтобы путь счетчика не стал недействительным, прежде чем я смогу использовать его для получения дескриптора счетчика?

1 ответ

Вау, ты прав. Это кажется мне серьезным недостатком дизайна. В принципе, невозможно надежно контролировать экземпляр, если его имя не уникально. Я наткнулся на обходной путь специально для объектов Process и Thread, но это глобальная настройка, которая может повлиять на другие приложения.

Я думаю, что самый безопасный способ сделать это - наблюдать за всеми объектами процесса, и каждый раз, когда вы собираете данные, проходите и находите объект с нужным идентификатором процесса.

Другие вопросы по тегам