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


    Github

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

    //第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;
    }
    
    
  • 相关阅读:
    java.lang.IllegalArgumentException: No converter found for return value of type: class XXX.XXXX
    关于websocket集群中不同服务器的用户间通讯问题
    JavaScript中 location.host 与 location.hostname 的区别
    Spring在代码中获取bean的几种方式
    在websocket中怎么样注入service类
    阿里云上部署kafka--遇到的坑
    linux系统部署Java程序获取ip时报Caused by: java.net.UnknownHostException: XXXXXXXXXX: XXXXXXXXXX: Name or service not known
    解决bash: mysql: command not found 的方法
    Nginx的启动、停止与重启
    Java8:Lambda表达式增强版Comparator和排序
  • 原文地址:https://www.cnblogs.com/gongluck/p/9335484.html
Copyright © 2020-2023  润新知