【Windows原理】线程池-定时调用函数

// 01.线程池_定时调用函数-复习.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>

VOID NTAPI TimerProc(
	_Inout_ PTP_CALLBACK_INSTANCE Instance,
	_Inout_opt_ PVOID Context, 
	_Inout_ PTP_TIMER Timer)
{
	printf("[%d] %d\n",(int)Timer,(int)Context);
}

int _tmain(int argc, _TCHAR* argv[])
{
	/*
	 * 创建定时器内核对象
	 * 参数1:回调函数
	 * 参数2:回调函数的参数
	 * 参数3:调用哪个线程池,NULL默认线程池
	 **/
	PTP_TIMER Timer = CreateThreadpoolTimer(TimerProc, 0, NULL);

	/*
	 * 提交一个定时器
	 * SYSTEMTIME  sysTime;
	 * sysTime.wYear = 2019;
	 * sysTime.wMonth = 8;
	 * sysTime.wDay = 1;
	 * sysTime.wHour = 12;
	 * sysTime.wMinute = 12;
	 * sysTime.wSecond = 12;
	 * SystemTimeToFileTime(&sysTime, &time );
	 *
	 **/
	FILETIME time = { 0 };
	time.dwLowDateTime = -1; // -1 立即执行

	/*
	 * SetThreadpoolTimer可以多次调用,修改定时器调用时间,
	 * 参数1:创建的Timer线程池
	 * 参数2:多少秒后触发
	 * 参数3:多少毫秒触发一次,0表示只执行一次,然后暂停,如果再次设置
	 * 为0,1次都不执行
	 * 参数4:随机值
	 **/

	//SetThreadpoolTimer(Timer, &time, 500, 10);
	Sleep(1000);

	// 定时器2
	SetThreadpoolTimer(Timer, &time, 0, 10);
	SetThreadpoolTimer(Timer, &time, 0, 10);
	SetThreadpoolTimer(Timer, &time, 0, 10);
	SetThreadpoolTimer(Timer, &time, 0, 10);


	// 等待定时器回调函数完成,一般用不到
	WaitForThreadpoolTimerCallbacks(Timer, 0);

	system("pause");
	CloseThreadpoolTimer(Timer);

	return 0;
}

 

如果要多少秒后触发,需要设置负数以纳秒为单位

FILETIME time;
LARGE_INTEGER li;
li.QuadPart = -(50000000);
time.dwHighDateTime = li.HighPart;
time.dwLowDateTime = li.LowPart;

 

文 / luna
LEAVE A REPLY

loading