Windows提供了一個線程池機制來簡化線程的創建、銷燬及管理工作。有以下情形可使用線程池:
1. 以異步的方式來調用一個函數;
1)首先定義一個回調函數,函數原型:
void NTAPI SimpleCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext);
2)爲了讓線程池中的一個線程執行上面的回調函數,需調用下面的函數向線程池提交一個請求:
BOOL TrySubmitThreadpoolCallback(
PTP_SIMPLE_CALLBACK pfnCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
2.每隔一段時間調用一個函數 ;
1)首先定義一個回調函數,函數原型:void CALLBACK T imeoutCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PTP_TIMER pTimer);
2) 調用下面函數告知線程池在何時調用回調函數:
PTP_TIMER CreateThreadpoolTimer(
PTP_TIMER_CALLBACK pfnTimerCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
3) 當想向線程池註冊計時器時應調用下面的函數:
VOID SetThreadpoolTimer(
PTP_TIMER pTimer,
PFILETIME pftDueTime,
DWORD msPeriod,
DWORD msWindowLength);
3.當內核對象觸發的時候調用一個函數;
1)首先定義一個回調函數,函數原型:void CALLBACK WaitCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PTP_WAIT Wait,
TP_WAIT_RESULT WaitResult);
2) 調用下面函數來創建一個線程池等待對象:
PTP_WAIT CreateThreadpoolWait(
PTP_WAIT_CALLBACK pfnWaitCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
3) 調用下面的函數將一個內核 綁定到這個線程池:
VOID SetThreadpoolWait(
PTP_WAIT pWaitItem,
HANDLE hObject,
PFILETIME pftTimeout`);
4.當異步I/O請求完成的時候調用一個函數。
1) 指定一個回調函數,函數原型:
VOID CALLBACK OverlappedCompletionRoutine(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PVOID pOverlapped,
ULONG IoResult,
ULONG NumberOfBytesTransferred,
PTP_IO pIo);
2)調用下面的函數創建一個線程池I/O對象:
PTP_IO CreateThreadpoolIo(
HANDLE hDevice,
PTP_WIN32_IO_CALLBACK pfnIoCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
3)調用下面的函數將設備線程池內部的I/O完成端口關聯起來:
VOID StartThreadpoolIo(PTP_IO pio);
4)調用下面的函數讓線程池停止調用回調函數:
VOID CancelThreadpoolIo(PTP_IO pio);
5)調用下面的函數解除文件/設備與線程池I/O完成端口的關聯:
VOID CloseThreadpoolIo(PTP_IO pio);