工作佇列 API 概觀
工作佇列是由兩個佇列連接埠組合而成:工作連接埠和 完成連接埠。這些連接埠會綁定在同一個物件中,因為您 通常兩者都需要:工作連接埠用於執行非同步工作,而 完成連接埠用於將其告知使用者。 工作佇列的說明如下。- 包含兩個工作佇列連接埠。
- 每個工作佇列連接埠都可以有自己的分派模式,此模式決定 佇列中的項目如何分派。
- 分派模式的範圍從透過 系統執行緒集區完全自動分派,到必須 明確移除工作的完全手動分派。
- 回呼可以提交至佇列的任一連接埠。
- 佇列以控制代碼表示。控制代碼可以複製,這基本上 會增加佇列的參考計數。
- 執行緒集區: 排入執行緒集區佇列的回呼會在 系統執行緒集區上執行。執行緒集區會平行叫用 呼叫,每當有執行緒集區執行緒可用時,就依序從佇列取出 要執行的呼叫。
- 序列化執行緒集區: 回呼會排入佇列並在 執行緒集區上執行,但會逐一執行,而不是在所有執行緒集區執行緒上 平行執行。
- 手動: 排入手動佇列的回呼不會自動 分派。您可以自行決定在任何想要的執行緒上 分派它們。如果您使用手動工作佇列,必須確保您 也會提取 Windows 訊息佇列。
- 立即: 立即分派模式完全不會排入佇列。它會 立即在提交回呼的執行緒上執行 該呼叫。
XTaskQueueDuplicateHandle、
XTaskQueueSubmitCallback、XTaskQueueSubmitDelayedCallback 和
XTaskQueueCreateComposite 都會為佇列控制代碼新增參考。這
表示在所有回呼完成之前,佇列實際上
不會終結。
工作佇列控制代碼是每個處理序專屬的資源,無法封送處理或
在處理序之外使用。
使用模式
工作佇列的典型使用模式如下。- 建立工作佇列控制代碼,然後為每個連接埠指定分派模式。
- 如果您使用手動分派,請建立應用程式專屬的執行緒,以 呼叫佇列的分派函式。
-
將佇列當作 Microsoft Game Development Kit (GDK) 呼叫的參數使用,或直接
使用
XTaskQueueCallback提交。 - (選擇性) 在應用程式關閉時終止工作佇列。
非同步工作佇列操作說明主題
本節提供常見非同步工作佇列案例的操作說明範例。本節內容
建立執行緒集區工作佇列 提供範例,示範如何建立工作佇列,以在系統執行緒集區上分派工作回呼和完成回呼。 提交回呼 提供範例,示範如何將回呼提交至工作佇列的工作連接埠或完成連接埠。 複製工作佇列控制代碼 提供範例,示範如何複製工作佇列控制代碼。如果您有長時間執行的工作,可能會想要在工作期間複製工作佇列控制代碼。如此一來,在您仍需要佇列時,任何呼叫XTaskQueueCloseHandle 的人都不會關閉該佇列。
建立手動工作佇列
提供範例,示範如何建立以手動方式提取的工作佇列。它會建立兩個 STL 執行緒,分別為工作連接埠和完成連接埠分派呼叫。
使用事件控制手動佇列分派
提供範例,示範如何在工作佇列有項目要分派時,使用工作佇列對條件變數發出訊號。
搭配 Windows 訊息迴圈使用工作佇列
提供範例,使用執行緒集區處理工作,但將完成連接埠回呼整合至 Win32 視窗程序。此範例也示範了在將工作佇列與其他執行緒模型整合時,如何正確終止工作佇列。
使用處理序工作佇列
提供範例,示範如何使用處理序工作佇列。預設的處理序工作佇列會使用執行緒集區進行工作分派和完成分派。
建立複合工作佇列
提供範例,使用執行緒集區處理工作,但將完成連接埠回呼整合至 Win32 WindowProc 回呼函式。此範例也示範了在將工作佇列與其他執行緒模型整合時,如何正確終止工作佇列。
使用延遲回呼
提供範例,示範如何使用延遲回呼,每 500 毫秒叫用一次回呼,共叫用 10 次。使用工作佇列並透過 XTaskQueueSubmitDelayedCallback API,在未來的時間點提交回呼。如此一來,您可以在短暫延遲後重試失敗的呼叫,或將其當作定期事件的低成本計時器使用。
使用工作佇列等候程式
提供範例,示範如何使用工作佇列等候程式。您可以向工作佇列註冊 Win32 核心控制代碼。當控制代碼變成已發出訊號狀態時,您的回呼就會提交至佇列。
