2011-09-28 8 views
0

이전 "How do I get a Windows Performance Counter for the current process"문제를 해결하려고합니다. 기본적으로 저는 enumerating Process Object instances입니다. Process 개체의 목록을 가져 와서 해당 프로세스 ID를 쿼리하고 내 자신과 비교할 수 있습니다.현재 프로세스의 성능 카운터가있는 경쟁 조건

이에 기반하여 올바른 인스턴스 인덱스 (\Process(my_program#3)\<counter>과 비슷한 것을 만들기 위해)를 사용하여 성능 카운터 경로를 만들 수 있는데, 그 쿼리를 사용하여 내가 관심있는 카운터를 쿼리 할 수 ​​있습니다. 그러나 하나 또는 PdhAddCounter 호출 전에 my_program의 다른 인스턴스가 더 많이 종료 되었습니까? 제가 올바르게 이해한다면, 이것은 제 카운터 경로가 이제 다른 과정을 가리키거나 현재 유효하지 않음을 의미합니다. 심지어 프로세스 ID를 쿼리하는 동안 사라질 수도 있습니다 ...

카운터 핸들을 얻기 전에 카운터 경로가 유효하지 않게되는 것을 어떻게 방지합니까?

+0

저는 기존 카운터의 경로가 변경되지 않을 것이라고 확신합니다. 인스턴스는 올 수 있고 이동하여 식별자 (따라서 경로)를 재활용하지만, 인스턴스가 살아있는 한 동일한 식별자 (따라서 경로)를 가질 것이라고 확신합니다. 이것이 사실이 아니라면 나는 충격을받을 것이다. – Luke

+0

@ 루케 : 불행히도 경로는 유효하지 않게됩니다. 이것은 다른 인스턴스가 이미 시작되었을 때 디버거에서 프로그램을 열고 프로그램이 올바른 인스턴스 (# 1)를 결정한 다음 첫 번째 인스턴스를 수동으로 닫은 다음 다시 스테핑하여 카운터를 쿼리하는 프로그램 - 작동하지 않습니다. – villintehaspam

답변

0

와우, 네 말이 맞아. 이것은 나에게 주요한 디자인 결함 인 것 같다. 이름이 고유하지 않으면 인스턴스를 안정적으로 모니터하는 것은 기본적으로 불가능합니다. 특히 프로세스 및 스레드 객체에 대해 workaround을 우연히 발견했지만 다른 응용 프로그램에 영향을 줄 수있는 전역 설정입니다.

이 작업을 수행하는 가장 안전한 방법은 모든 프로세스 개체를보고 데이터를 수집 할 때마다 원하는 프로세스 ID가있는 데이터를 찾을 때라고 생각합니다.

+0

해결 방법은 다른 응용 프로그램에 영향을 미칠 수 있으므로 사용자가 직접 지적한대로 해결되지는 않습니다. 모든 프로세스를 모니터링하면 도움이 될까요? 내가 알 수있는 한, 열린 카운터를 그것이 속한 프로세스에 매핑하는 방법이 없습니다. – villintehaspam

+0

나는 PdhAddCounter로 이것을 할 수 있다고 생각지 않는다. 어쩌면 레지스트리 인터페이스를 사용하여 모든 프로세스에 대한 여러 카운터를 수집 할 수 있습니다. 이 경우 카운터는 각 개체에 대해 순차적으로 저장되며 거기에서 확인할 수 있습니다. 나는 틀릴 수도있다. 나는 최근에 구현 한 공급자의 관점에서 이것을 생각하고 있습니다. 소비자 코드를 작성하지 않았습니다. – Luke

+0

MSDN에서는 "카운터 데이터를 사용하기 위해 레지스트리 기능을 사용하면 안됩니다." – villintehaspam