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