2017-07-02 102 views
1

這個版本(基於this文章)的工作原理:如何使用Win32 ThreadPool API?

#include <windows.h> 
#include <tchar.h> 
#include <stdio.h> 

VOID 
CALLBACK 
MyWorkCallback(
    PTP_CALLBACK_INSTANCE Instance, 
    PVOID     Parameter, 
    PTP_WORK    Work 
) 
{ 
    // Instance, Parameter, and Work not used in this example. 
    UNREFERENCED_PARAMETER(Instance); 
    UNREFERENCED_PARAMETER(Parameter); 
    UNREFERENCED_PARAMETER(Work); 

    DWORD threadId = GetCurrentThreadId(); 

    BOOL bRet = FALSE; 

    // 
    // Do something when the work callback is invoked. 
    // 
    { 
     _tprintf(_T("MyWorkCallback: ThreadId = %d Task performed.\n"), threadId); 
    } 

    return; 
} 

int main() 
{ 
    TP_CALLBACK_ENVIRON CallBackEnviron; 
    PTP_POOL pool = NULL; 
    PTP_CLEANUP_GROUP cleanupgroup = NULL; 
    PTP_WORK_CALLBACK workcallback = MyWorkCallback; 
    PTP_TIMER timer = NULL; 
    PTP_WORK work = NULL; 


    InitializeThreadpoolEnvironment(&CallBackEnviron); 
    pool = CreateThreadpool(NULL); 
    SetThreadpoolThreadMaximum(pool, 1); 
    SetThreadpoolThreadMinimum(pool, 3); 
    cleanupgroup = CreateThreadpoolCleanupGroup(); 
    SetThreadpoolCallbackPool(&CallBackEnviron, pool); 
    SetThreadpoolCallbackCleanupGroup(&CallBackEnviron, cleanupgroup, NULL); 
    work = CreateThreadpoolWork(workcallback, NULL, &CallBackEnviron); 
    for (int i = 0; i < 10; ++i) 
    { 
     SubmitThreadpoolWork(work); 
    } 
} 

但是,此版本也可以(與上面相同的功函數):

int main() 
{ 
    PTP_WORK = CreateThreadpoolWork(workcallback, NULLPTR, NULLPTR); 
    for (int i = 0; i < 10; ++i) 
    { 
     SubmitThreadpoolWork(work); 
    } 
} 

什麼是兩個版本之間的差異(除了最小和最大線程數)?
爲什麼我會使用另一個版本?

+0

您實際上並未使用清理組支持的功能。而設置最大值= 1和最小值= 3是沒有意義的。所以你更喜歡第二個片段,更簡單的需求需要更少的代碼。 –

回答

2

這是覆蓋在文檔中的InitializeThreadpoolEnvironment

創建一個回調的環境,如果你打算調用的以下功能之一修改環境:

  • SetThreadpoolCallbackCleanupGroup

  • SetThreadpoolCallbackLibrary

  • SetThreadpoolCallbackPool

  • SetThreadpoolCallbackPriority

  • SetThreadpoolCallbackRunsLong

如果你需要通過一個或多個列出的函數提供的功能,那麼你需要創建一個回調的環境。如果你不這樣做,你就不會。

如果對開始新項目有疑問,請使用簡單的方法開始,看看它是否符合您的需求。如果有必要,您可以隨時返回並切換到更復雜的變體。