/ / Stan wyścigu z licznikami wydajności dla bieżącego procesu - c ++, windows, performancecounter, pdh

Stan wyścigu z licznikami wydajności dla bieżącego procesu - c ++, windows, performancecounter, pdh

Próbuję obejść stare „Jak uzyskać licznik wydajności systemu Windows dla bieżącego procesu„problem. Zasadniczo jestem wyliczanie instancji obiektów procesu aby uzyskać listę obiektów Process, które mogę następnie zapytać o ich identyfikator procesu i porównać z własnymi.

Na tej podstawie mogę zbudować ścieżkę licznika wydajności przy użyciu poprawnego indeksu instancji (aby utworzyć coś podobnego do Process(my_program#3)<counter>), którego mogę użyć do zapytania dowolnego licznika, który mnie interesuje. Ale co się stanie, jeśli jedno lub więcej innych wystąpień mojego_programu zakończy się przed PdhAddCounter połączenie? Jeśli dobrze rozumiem, oznacza to, że moja ścieżka licznika odnosi się teraz do innego procesu lub jest teraz nieprawidłowa. Mogą nawet zniknąć podczas zapytania o identyfikator procesu ...

Jak zapobiec utracie ważności ścieżki licznika, zanim będę mógł jej użyć do uzyskania uchwytu licznika?

Odpowiedzi:

0 dla odpowiedzi № 1

Wow, masz rację. Wydaje mi się to poważną wadą projektową. Zasadniczo niemożliwe jest niezawodne monitorowanie wystąpienia, jeśli jego nazwa nie jest unikalna. Natknąłem się na obejście specjalnie dla obiektów Process i Thread, ale jest to ustawienie globalne, które może wpływać na inne aplikacje.

Myślę, że najbezpieczniejszym sposobem jest obejrzenie wszystkich obiektów procesu i za każdym razem, gdy zbierasz dane, przechodzisz i znajdujesz ten o pożądanym identyfikatorze procesu.