共用方式為


管理線程參考

本文包含使用 Shell 輕量級公用程式函式進行線程參考管理的相關資訊。

當需要在子線程存活期間保持父線程作用中時,會出現這種情況。 例如,如果在父線程上建立元件物件模型 (COM) 物件,並封送處理至子線程,該父線程就無法在子線程之前終止。 為了達成此目的,Shell 提供這些功能。

如這裡所述,請在父線程中使用這些函式。

  1. ThreadProc 函式的形式宣告應用程式定義的線程程式。

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. 在您的 ThreadProc中,調用 SHCreateThreadRef ,以建立執行緒參考。 這提供了一個指向 IUnknown實例的指標。 這個 IUnknown 會使用 pcRef 所指向的值來維護參考計數。 只要此計數大於0,線程就會維持使用中狀態。

  3. 使用該指標 IUnknown,在 ThreadProc中呼叫 SHSetThreadRef。 這設置參考,以便後續呼叫 SHGetThreadRef 時有可擷取的內容。

  4. 如果您的 ThreadProc 建立另一個線程,該線程的 ThreadProc 可以使用由 SHCreateThreadRef取得的 IUnknown 指標來呼叫 SHGetThreadRef。 這會增加 pcRef 參數在 SHCreateThreadRef中所指向的參考計數。

  5. 建立線程。 這通常是藉由呼叫 SHCreateThread來完成,將指標傳遞至 pfnThreadProc 參數 中的 ThreadProc。 同時在 dwFlags 參數中傳遞 CTF_THREAD_REF 旗標。 只要 ThreadProc 執行,線程即為使用中。

  6. 建立子線程時,請在呼叫 SHCreateThread時,將 CTF_REF_COUNTED 旗標傳遞至 dwFlags 參數中。

  7. 當子線程完成並釋放時,父線程 pcRef 所指向的值會減少。 所有子線程完成之後,原始 ThreadProc 可以完成並釋放最終線程引用,將引用計數降至 0。 此時,釋放對 SHCreateThread 所開啟之原始線程的參考,並結束該線程。

另一個相關的函式是 SHReleaseThreadRef。 如果線程是使用 SHCreateThread 並搭配 CTF_THREAD_REF 標誌進行建立,則ThreadProc 會呼叫這個函式。 不過,ThreadProc 不需要以隱含方式執行。 在指向透過 SHCreateThreadRef 取得的 IUnknown 的指標上呼叫 IUnknown::Release 就足夠了。