2017-07-02 33 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); 
    } 
} 

2つのバージョン間の違いは何ですか(最小スレッド数と最大スレッド数を除く)?
なぜ別のバージョンを使用するのですか?

+0

クリーンアップグループでサポートされている機能を実際に使用していません。そして、max = 1とmin = 3の設定は意味をなさない。だから、2番目のスニペットが好きで、よりシンプルな要求で少ないコードが必要です。 –

答えて

2

これはInitializeThreadpoolEnvironmentのドキュメントで覆われている:

あなたは環境を変更するには、次の関数のいずれかを呼び出すために計画している場合、コールバック環境を作成します。

  • SetThreadpoolCallbackCleanupGroup

  • SetThreadpoolCallbackLibrary

  • SetThreadpoolCallbackPool

  • SetThreadpoolCallbackPriority

  • SetThreadpoolCallbackRunsLong

あなたが記載されている機能の一つまたは複数によって提供される機能が必要な場合は、コールバック環境を作成する必要があります。あなたがしなければ、あなたはしません。

新しいプロジェクトを開始する際に不明な点がある場合は、簡単な方法で開始し、ニーズに合っているかどうかを確認してください。必要になった場合はいつでも戻ってより複雑なバリアントに切り替えることができます。

関連する問題