使用Windows API函数来创建线程池,可以极大的方便了自己编写线程池的繁琐步骤。

使用CreateThreadPool来创建一个线程池,需要在创建完成后,初始化线程池的状态,并且在不需要的时候清理线程池所占用的资源。

相关代码:

    auto m_ptp_pool = CreateThreadpool(NULL);            // 创建线程池
SetThreadpoolThreadMaximum(m_ptp_pool, 12);
SetThreadpoolThreadMinimum(m_ptp_pool, 1);
InitializeThreadpoolEnvironment(&m_tp_callback_environ);

以上代码第一行表示,1.我们创建一个线程池,2.设置线程池的最大个数,3.设置线程池的最小个数,4.设置线程池的环境资源对象

在满足以上条件后我们就可以将我们的任务添加到线程池中进行运行。线程池的函数要求必须是一个全局变量。

线程池任务函数要求规格:

typedef VOID (NTAPI *PTP_SIMPLE_CALLBACK)(
_Inout_ PTP_CALLBACK_INSTANCE Instance,
_Inout_opt_ PVOID Context
);

将任务添加到线程池:

if(TrySubmitThreadpoolCallback(func, this, &m_tp_callback_environ)==0)
m_box.InsertString(0, TEXT("线程失败!"));

func函数示例:

void func(PTP_CALLBACK_INSTANCE a, LPVOID args) {
CMyMfcSdiView* obj = (CMyMfcSdiView*)args; // 由于我的测试是在MFC下使用的,故采用MFC对象进行显示,但是不影响线程池的使用
obj->m_box.InsertString(0, TEXT("线程写入"));
}

使用TrySubmitThreadpoolCallback函数将任务添加到创建好的线程池,并且线程立即执行。可以多次调用该函数将需要的任务添加到线程池中执行。

如果我们不再需要线程池,需要将线程池的环境资源对象释放,并且关闭线程池句柄,来优化系统资源。

    DestroyThreadpoolEnvironment(&m_tp_callback_environ);
CloseThreadpool(m_ptp_pool);

至此,一个线程池的创建,使用,销毁就结束了,至于API函数的参数类型,可以参考在键入api函数时参考参数提示

或者参考以下两个变量,在上述代码中用到:

   PTP_POOL m_ptp_pool;
TP_CALLBACK_ENVIRON m_tp_callback_environ;

以上测试用例在VS2022中运行,如果您有什么问题,欢迎提问

最新文章

  1. PRIMARY LANGUAGE ID not a number
  2. WinForm界面布局控件WeifenLuo.WinFormsUI.Docking"的使用 (二)
  3. MySQL 索引详解
  4. html-----012---颜色的改变
  5. 高效算法——A 归并排序
  6. 【Oracle】删除重复记录
  7. access 语句错误
  8. 【LeetCode从零单排】No15 3Sum
  9. css 好看的div文本框 渐变+ 背景 + 阴影 实际应用
  10. log4j的一些配置
  11. 基于Cisco packet tracer的AAA认证
  12. HBase之CF持久化系列(续1)
  13. MSSQL coalesce系统函数简介
  14. Objective-C简介
  15. 【转】android:paddingLeft与android:layout_marginLeft的区别
  16. MySql 数据库安装、环境变量配置 以及 本地连接
  17. Caffe中Interp层的使用
  18. bootstrap入门基础
  19. ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 42. Created with MySQL 50560, now running 50725. Please use mysql_upgrade to fix this error.
  20. ros 充电topic

热门文章

  1. Pipeline 有什么好处,为什么要用 pipeline?
  2. jQuery对象的创建
  3. 面试问题之数据结构与算法:map与unordered_map
  4. 为什么HTTP/3要基于UDP?可靠吗?
  5. docker 容器简单使用
  6. 《基于.NET Core构建微服务》系列文章(更新至第6篇,最新第7篇,已发布主页候选区)
  7. 【译】客户端存储(Client-Side Storage)
  8. APICloud首款全功能集成开发工具重磅发布,彰显云端一体理念
  9. React+dva+webpack+antd-mobile 实战分享(一)
  10. java中匿名内部类的匿名构造函数是怎么用的