• windows线程池


     以异步的方式调用

    1. #include "stdafx.h"
    2. #include <windows.h>
    3. #include <iostream>
    4. using namespace std;
    5. //线程池的回调函数
    6. VOID WINAPI ThreadPoolCallBack(PTP_CALLBACK_INSTANCE instance, PVOID param)
    7. {
    8. cout << "param:" << (int)param << "\tThread id = " << GetCurrentThreadId() << endl;
    9. Sleep(200); // 模拟一个任务时间为100毫秒的执行
    10. return;
    11. }
    12. DWORD GetNumOfProcess()// 获取CPU的核心数
    13. {
    14. SYSTEM_INFO sysinfo;
    15. GetSystemInfo(&sysinfo); // 获取操作系统信息
    16. return sysinfo.dwNumberOfProcessors;
    17. }
    18. int main()
    19. {
    20. PTP_POOL tPool;
    21. tPool = CreateThreadpool(NULL); // 创建一个线程池
    22. DWORD dwMaxThread = 3; // GetNumOfProcess() * 2 + 1;
    23. //设置线程池参数(线程池中的线程数)
    24. SetThreadpoolThreadMaximum(tPool, dwMaxThread); // 线程池中最多线程数
    25. SetThreadpoolThreadMinimum(tPool, 1); // 线程池中最少线程数
    26. TP_CALLBACK_ENVIRON tcEnv;
    27. InitializeThreadpoolEnvironment(&tcEnv); // 初始化线程池的回调环境
    28. SetThreadpoolCallbackPool(&tcEnv, tPool); // 给线程池分配回调环境
    29. cout << "线程池中的线程数为:" << dwMaxThread << endl << endl;
    30. //测试例子
    31. for (int i = 1;i < 20;i++)
    32. {
    33. // 向线程池中投递一个任务
    34. TrySubmitThreadpoolCallback(ThreadPoolCallBack, (PVOID)i, &tcEnv);
    35. }
    36. Sleep(100000);
    37. return 0;
    38. }

    线程池的定时器

    1. int g_ncount = 9;
    2. bool g_bfinish = false;
    3. TCHAR g_sztext[100];
    4. #define id_dlg 0x0000ffff
    5. void CALLBACK timeoutcallback(PTP_CALLBACK_INSTANCE instance, PVOID context,PTP_TIMER time)
    6. {
    7. HWND hwnd = FindWindow(NULL,L"warning");
    8. if (hwnd != NULL)
    9. {
    10. if (g_ncount == 0)
    11. {
    12. g_ncount = 9;
    13. EndDialog(hwnd, IDOK);
    14. return;
    15. }
    16. }
    17. char text[128];
    18. TCHAR Name[128];
    19. sprintf(text, "you have %d seconds to respond", g_ncount--);
    20. MultiByteToWideChar(CP_ACP, 0, text, -1, Name, 100);
    21. SetDlgItemText(hwnd, id_dlg, Name);
    22. qDebug() << text;
    23. }
    24. {
    25. //每隔一段时间,计时器
    26. PTP_TIMER time = CreateThreadpoolTimer(timeoutcallback, NULL, NULL);
    27. ULARGE_INTEGER uistarttime;
    28. uistarttime.QuadPart = (LONGLONG)-(10000000);
    29. FILETIME fttime;
    30. fttime.dwHighDateTime = uistarttime.HighPart;
    31. fttime.dwLowDateTime = uistarttime.LowPart;
    32. SetThreadpoolTimer(time, &fttime,1000,0);
    33. g_ncount = 9;
    34. MessageBox(NULL,L"you have 10 seconds to respond", L"warning",MB_OK);
    35. WaitForThreadpoolTimerCallbacks(time, TRUE);
    36. CloseThreadpoolTimer(time);
    37. }

    线程池内核对象

    1. HANDLE g_hEvent;
    2. VOID CALLBACK WaitFuncCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WAIT Wait, TP_WAIT_RESULT WaitResult)
    3. {
    4. char text[128];
    5. sprintf(text,"WaitFuncCallback is called, data = %d\n", *(int*)Context);
    6. qDebug() << text;
    7. ResetEvent(g_hEvent);
    8. Sleep(5000);
    9. }
    10. //内核对象
    11. g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    12. INT dd = 5;
    13. PTP_WAIT pWait = CreateThreadpoolWait(WaitFuncCallback, &dd, NULL);
    14. SetThreadpoolWait(pWait, g_hEvent, NULL);//只有被触发或者超时,才调用WaitFuncCallback函数
    15. Sleep(1000);
    16. SetEvent(g_hEvent);//触发
    17. Sleep(200); //等待内核对象被触发,调用回调函数
    18. WaitForThreadpoolWaitCallbacks(pWait, FALSE);//等待函数,等WaitFuncCallback函数返回才执行下去
    19. CloseThreadpoolWait(pWait);
    20. CloseHandle(g_hEvent);

    io内核对象

    1. //io操作完成才会被调用
    2. VOID CALLBACK IoCompletionCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PVOID Overlapped
    3. , ULONG IoResult, ULONG_PTR NumberOfBytesTransferred, PTP_IO Io)
    4. {
    5. int a = 1;
    6. if (IoResult == NO_ERROR)
    7. {
    8. qDebug() << " no error! " << "transfer num is " << NumberOfBytesTransferred;
    9. }
    10. else
    11. {
    12. qDebug() << "IoResult is" << IoResult << "transfer num is " << NumberOfBytesTransferred;
    13. }
    14. }
    15. HANDLE hTxtFile = CreateFile(L"test.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    16. PTP_IO PIO = CreateThreadpoolIo(hTxtFile, IoCompletionCallback, nullptr, nullptr);
    17. StartThreadpoolIo(PIO);
    18. char buf[512] = { 0 };
    19. OVERLAPPED ol = { 0 };
    20. bool bret = ReadFile(hTxtFile, buf, 512, nullptr, &ol);
    21. WaitForThreadpoolIoCallbacks(PIO, FALSE);
    22. CloseThreadpoolIo(PIO);
    23. CloseHandle(hTxtFile);

    线程的封装

    1. VOID WINAPI ThreadPoolCallBack(PTP_CALLBACK_INSTANCE instance, PVOID param)
    2. {
    3. qDebug() << " tThread id = " << GetCurrentThreadId() ;
    4. Sleep(100); // 模拟一个任务时间为100毫秒的执行
    5. HANDLE phand = (HANDLE*)param;
    6. SetEvent(phand);
    7. }
    8. //封装线程池
    9. PTP_POOL tPool;
    10. tPool = CreateThreadpool(NULL); // 创建一个线程池
    11. SetThreadpoolThreadMaximum(tPool, 4);//设置线程池的最大个数
    12. SetThreadpoolThreadMinimum(tPool, 1);
    13. TP_CALLBACK_ENVIRON tcenv;
    14. InitializeThreadpoolEnvironment(&tcenv); //设置线程池的环境资源对象
    15. SetThreadpoolCallbackPool(&tcenv, tPool); // 给线程池分配回调环境
    16. HANDLE hEvent[10];
    17. for (int i = 0; i < 10; i++)
    18. {
    19. hEvent[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
    20. TrySubmitThreadpoolCallback(ThreadPoolCallBack, hEvent[i],&tcenv);// 向线程池中投递一个任务,并且线程立即执行
    21. }
    22. WaitForMultipleObjects(10, hEvent, TRUE, INFINITE);
    23. DestroyThreadpoolEnvironment(&tcenv);//将线程池的环境资源对象释放
    24. CloseThreadpool(tPool);//关闭线程池句柄,来优化系统资源

  • 相关阅读:
    CentOS7安装MySQL8
    shiro之AccessControlFilter()
    【Go编程语言】流程控制
    前脚收费,后脚道歉?Unity收费新规引众怒,Epic承诺虚幻引擎永久免费
    CSRF漏洞
    Redis系列10:HyperLogLog实现海量数据基数统计
    Jetson Nano 部署(4) : Tensorrt Nano硬件搭建
    网上流量卡这么便宜,线上申请的流量卡有虚标吗
    EMQX Newsletter 2022-08|企业版 5.0 开发进行中、EMQX Kubernetes Operator 2.0 即将发布
    虹科 | 解决方案 | 新能源车EV测试解决方案
  • 原文地址:https://blog.csdn.net/baidu_16370559/article/details/126954011