C++ 如何使用Win32线程池API?

C++ 如何使用Win32线程池API?,c++,winapi,threadpool,C++,Winapi,Threadpool,此版本(基于文章)适用于: #包括 #包括 #包括 无效的 回拨 MyWorkCallback( PTP_回调_实例实例, PVOID参数, PTP_工作 ) { //实例、参数和功在本例中未使用。 未引用的_参数(实例); 未引用的_参数(参数); 未引用的_参数(功); DWORD threadId=GetCurrentThreadId(); 布尔-布雷特=假; // //在调用工作回调时执行某些操作。 // { _tprintf(_T(“MyWorkCallback:ThreadId=%d

此版本(基于文章)适用于:

#包括
#包括
#包括
无效的
回拨
MyWorkCallback(
PTP_回调_实例实例,
PVOID参数,
PTP_工作
)
{
//实例、参数和功在本例中未使用。
未引用的_参数(实例);
未引用的_参数(参数);
未引用的_参数(功);
DWORD threadId=GetCurrentThreadId();
布尔-布雷特=假;
//
//在调用工作回调时执行某些操作。
//
{
_tprintf(_T(“MyWorkCallback:ThreadId=%d任务已执行。\n”)、ThreadId);
}
返回;
}
int main()
{
TP_CALLBACK_ENVIRON CallBackEnviron;
PTP_POOL=NULL;
PTP_CLEANUP_GROUP cleanupgroup=NULL;
PTP_WORK_CALLBACK workcallback=MyWorkCallback;
PTP_定时器=空;
PTP_工时=空;
初始化ThreadPoolEnvironment(&CallbackEnvironment);
pool=CreateThreadpool(NULL);
SetThreadpoolThreadMaximum(池,1);
SetThreadpoolThreadMinimum(池,3);
cleanupgroup=CreateThreadpoolCleanupGroup();
SetThreadpoolCallbackPool(&CallBackEnviron,pool);
SetThreadpoolCallbackCleanupGroup(&CallBackEnviron,cleanupgroup,NULL);
work=CreateThreadpoolWork(workcallback、NULL和CallBackEnviron);
对于(int i=0;i<10;++i)
{
提交线程池工作(工作);
}
}
但是,此版本也适用(与上面的工作功能相同):

intmain()
{
PTP_WORK=CreateThreadpoolWork(workcallback,NULLPTR,NULLPTR);
对于(int i=0;i<10;++i)
{ 
提交线程池工作(工作);
}
}
两个版本(最小和最大线程数除外)之间的区别是什么?

为什么我要使用一个版本而不是另一个版本?

这在以下文档中介绍:

如果计划调用以下函数之一来修改环境,请创建回调环境:

  • SetThreadpoolCallbackCleanupGroup

  • SetThreadpoolCallbackLibrary

  • SetThreadpoolCallbackPool

  • SetThreadpoolCallbackPriority

  • SetThreadpoolCallbackRunsLong

如果需要一个或多个列出的函数提供的功能,则需要创建回调环境。如果你没有,你就没有


如果在开始一个新项目时有疑问,使用简单的方法开始,看看它是否满足您的需求。如果有必要,您可以随时返回并切换到更复杂的变体。

您实际上没有使用清理组支持的功能。设置max=1和min=3没有意义。所以您更喜欢第二个代码段,更简单的需求需要更少的代码。
#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);
    }
}