2011-09-28 39 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

@Luke:不幸的是路徑變得無效。當另一個實例已經啓動時,通過在調試器中打開程序很容易證明這一點,然後逐步讓程序確定正確的實例(#1),然後手動關閉第一個實例,然後再次步進以允許程序查詢櫃檯 - 他們不會工作。 – villintehaspam

回答

0

哇,你是對的。這對我來說似乎是一個主要的設計缺陷。基本上,如果名稱不是唯一的,就不可能可靠地監控實例。我偶然發現了一個針對進程和線程對象的workaround,但這是一個可能影響其他應用程序的全局設置。

我認爲最安全的方法是觀察所有過程對象,並且每次收集數據時都會找到所需的過程ID。

+0

解決方法可能會影響其他應用程序,因此不會像您自己指出的那樣飛行。監控所有流程是否有幫助?據我所知,沒有辦法映射到它屬於哪個進程的開放計數器。 – villintehaspam

+0

我不認爲你可以用PdhAddCounter做到這一點。也許你可以使用註冊表界面爲所有進程收集多個計數器;在這種情況下,我相信計數器會按順序存儲每個對象,您可以從中找出它。雖然我可能是錯的;我從最近實施的提供商的角度思考這個問題。還沒有寫過消費者代碼。 – Luke

+0

MSDN指出:「您不應該使用註冊表函數來消費計數器數據。」 – villintehaspam