前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows核心编程:第11章 Windows线程池

Windows核心编程:第11章 Windows线程池

作者头像
gongluck
发布2019-02-22 09:48:58
1.1K0
发布2019-02-22 09:48:58
举报
文章被收录于专栏:C++C++

Github

https://github.com/gongluck/Windows-Core-Program.git

代码语言:javascript
复制
//第11章 Windows线程池.cpp: 定义应用程序的入口点。
//

#include "stdafx.h"
#include "第11章 Windows线程池.h"

VOID NTAPI SimpleCB(
    _Inout_     PTP_CALLBACK_INSTANCE Instance,
    _Inout_opt_ PVOID                 Context
)
{

}

VOID NTAPI WorkCB(
    _Inout_     PTP_CALLBACK_INSTANCE Instance,
    _Inout_opt_ PVOID                 Context,
    _Inout_     PTP_WORK              Work
)
{

}

VOID NTAPI TimerCB(
    _Inout_     PTP_CALLBACK_INSTANCE Instance,
    _Inout_opt_ PVOID                 Context,
    _Inout_     PTP_TIMER             Timer
)
{
    static DWORD i = 0;
    i += 1;
    static LARGE_INTEGER li;
    li.QuadPart = -10000000ll * i;
    static FILETIME duetime = { 0 };
    duetime.dwLowDateTime = li.LowPart;
    duetime.dwHighDateTime = li.HighPart;

    SetThreadpoolTimer(Timer, &duetime, 0, 0); //设置定时器
}

VOID NTAPI WaitCB(
    _Inout_     PTP_CALLBACK_INSTANCE Instance,
    _Inout_opt_ PVOID                 Context,
    _Inout_     PTP_WAIT              Wait,
    _In_        TP_WAIT_RESULT        WaitResult
    )
{
    switch (WaitResult)
    {
    case WAIT_OBJECT_0:
        break;
    case WAIT_TIMEOUT:
        break;
    case WAIT_ABANDONED:
        break;
    default:
        break;
    }
}

VOID WINAPI IoCB(
    _Inout_     PTP_CALLBACK_INSTANCE Instance,
    _Inout_opt_ PVOID                 Context,
    _Inout_opt_ PVOID                 Overlapped,
    _In_        ULONG                 IoResult,
    _In_        ULONG_PTR             NumberOfBytesTransferred,
    _Inout_     PTP_IO                Io
)
{
    switch (IoResult)
    {
    case NO_ERROR:
        break;
    default:
        break;
    }
}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    //以异步方式调用函数
    BOOL bres = TrySubmitThreadpoolCallback(SimpleCB, nullptr, nullptr); //将工作项添加到线程池队列
    PTP_WORK pwork = CreateThreadpoolWork(WorkCB, nullptr, nullptr); //创建一个工作项
    SubmitThreadpoolWork(pwork); //向线程池提交一个请求
    WaitForThreadpoolWorkCallbacks(pwork, FALSE/*是否先尝试取消提交的工作项*/); //取消工作项或等待完成
    CloseThreadpoolWork(pwork); // 释放工作项内存
    pwork = nullptr;

    //每隔一段时间调用一个函数
    PTP_TIMER ptimer = CreateThreadpoolTimer(TimerCB, nullptr, nullptr); //创建定时器
    LARGE_INTEGER li;
    li.QuadPart = -1ll;//立即开始
    FILETIME duetime = { 0 };
    duetime.dwLowDateTime = li.LowPart; 
    duetime.dwHighDateTime = li.HighPart;
    SetThreadpoolTimer(ptimer, &duetime, 1/*再次调用的时间间隔*/, 0/*用来给回调函数的执行时间增加一些随机性*/); //设置定时器
    WaitForThreadpoolTimerCallbacks(ptimer, FALSE); //调试发现,TimerCB没机会执行,也没有阻塞主线程啊!?
    bres = IsThreadpoolTimerSet(ptimer); //检查定时器状态

    //在内核对象触发时调用一个函数
    PTP_WAIT pwait = CreateThreadpoolWait(WaitCB, NULL, nullptr); //创建线程池等待对象
    HANDLE hevent = CreateEvent(nullptr, FALSE, TRUE, nullptr);
    SetThreadpoolWait(pwait, hevent, nullptr); //绑定到线程池
    WaitForThreadpoolWaitCallbacks(pwait, FALSE);

    //在异步IO请求完成时调用一个函数
    HANDLE hFile = CreateFile(TEXT("第11章 Windows线程池.cpp"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
    PTP_IO pio = CreateThreadpoolIo(hFile, IoCB, nullptr, nullptr); //创建线程池IO对象
    char buf[_MAX_PATH] = { 0 };
    OVERLAPPED ol = { 0 };
    StartThreadpoolIo(pio); //每次IO调用之前,都要调用StartThreadpoolIo启用线程池IO对象
    bres = ReadFile(hFile, buf, _MAX_PATH, nullptr, &ol);
    StartThreadpoolIo(pio);
    bres = ReadFile(hFile, buf, _MAX_PATH, nullptr, &ol);
    WaitForThreadpoolIoCallbacks(pio, FALSE);
    StartThreadpoolIo(pio);
    CancelThreadpoolIo(pio); //撤销线程池IO对象
    bres = ReadFile(hFile, buf, _MAX_PATH, nullptr, &ol);

    system("pause");

    SetThreadpoolTimer(ptimer, nullptr, 0, 0); //取消定时器
    CloseThreadpoolTimer(ptimer);
    ptimer = nullptr;

    SetThreadpoolWait(pwait, nullptr, nullptr);
    CloseThreadpoolWait(pwait);
    pwait = nullptr;
    CloseHandle(hevent);
    hevent = nullptr;

    //CloseThreadpoolIo(pio);  //调用CancelThreadpoolIo之后不用CloseThreadpoolIo了
    pio = nullptr;

    CloseHandle(hFile);
    hFile = nullptr;

    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Github
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档