聊一聊枚舉一個進程中的所有線程
在 Win32 開發中,如果需要獲取程序運行過程中的一些較為底層的信息,你可能需要使用到 Tool Helper 庫。但我愿意稱之它為 Win32 中的 “害群之馬”。何解?
Tool Helper 庫在 16 位 Windows 時代就已經存在了,這個庫主要用來提供一些調試服務,例如獲取調用堆棧和枚舉系統中的所有內存等。
Win32 的初始版本中,并沒有包含它,直到 Windows 95 之后,32 位版本的 Tool Helper 程序庫才被引入到 Win32 中。
不管我們對它的評價如何,這些功能仍然存在,所以讓我們試一試看看效果。
運行上面的程序,它會打印系統中所有線程的列表(或至少是你有權訪問的所有線程)。
代碼的邏輯還是挺簡單的,唯一的微妙之處在于代碼中的一個奇怪的檢查,即 Thread32First 函數返回的大小足夠大,可以包含我們需要的 th32OwnerProcessID 字段。這種復雜性是必要的,因為 Thread32First 和 Thread32Next 函數檢查結構大小的方式有些非正統。
當一個 API 被認為是 Win32 API 的一匹害群之馬時,就會發生上面的這種情況。
總結
一般我們會將應用程序的設置數據保存到注冊表,這很方便,但是記得讀取的時候,盡量只讀一次并緩存結果,而不是每次都從注冊表里讀取,這對運行時性能是有傷害的。