繁体   English   中英

如何使用Win32 ThreadPool API?

[英]How to use 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);
    }
}

这两个版本之间有什么区别(最小和最大线程数除外)?
为什么要使用一个版本而不是另一个版本?

InitializeThreadpoolEnvironment的文档中对此进行了介绍:

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

  • SetThreadpoolCallbackCleanupGroup

  • SetThreadpoolCallbackLibrary

  • SetThreadpoolCallbackPool

  • SetThreadpoolCallbackPriority

  • SetThreadpoolCallbackRunsLong

如果您需要列出的一个或多个功能提供的功能,则需要创建一个回调环境。 如果不这样做,就不会。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM