C++ 等待定时器内核对象

可等待定时器对象Windows操作系统的一种同步对象,当设定的期限到了时,对象被置为signaled状态。

可创建两种可等待定时器对象:

  • 手工重置(manual-reset):保持signaled状态直至调用SetWaitableTimer函数设置了新的期限。

  • 同步(synchronization):保持signaled状态直至一个线程在该对象上完成了等待操作。

  • 两种可等待定时器对象都可以是周期定时器(periodic timer)。周期定时器在每次周期到期时可重新激活,直至它被重置或者被取消。周期定时器或者是手工重置定时器或者是同步定时器。

    当定时器变为signaled状态, 处理器须执行相关的指令(如completion routine)。高频率的定时器使得处理器处于繁忙状态,阻止其进入低能耗状态。考虑在程序中使用事件通知而不是定时器通知。如果必须使用定时器,考虑使用一次性定时器而不是周期定时器。或者设置周期定时器的间隔大于1秒钟。

    线程使用CreateWaitableTimer或CreateWaitableTimerEx函数创建定时器对象,并指明是手工重置定时器还是同步定时器,还可指定定时器的名字. 其他进程中的线程可以指出定时器的名字,用OpenWaitableTimer函数打开一个已经存在的定时器。任何线程可以给出一个定时器的句柄,用等待函数(wait function)在该定时器对象上等待其状态变为signaled.

    线程调用SetWaitableTimer函数来激活定时器,使用CancelWaitableTimer函数设置定时器为无效(inactive)状态。使用完定时器后,调用CloseHandle函数关闭它.

    Windows操作系统对定时器对象的处理过程为:

  • 当一个定时器被启动(set),定时器对象的状态为nonsignaled, 并被放在内核定时器队列中。

  • 当一个定时器到期,定时器对象置为signaled状态。如果定时器有(绑定的)完成过程(completion routine), 该完成过程被放入启动该定时期的线程的异步过程调用(APC)队列,直至该线程进入可唤醒等待状态(alertable wait state)时操作系统按照异步过程调用方式执行该过程. 如果为周期定时器,它再次被放入内核定时器队列。

  • 当一个定时器被取消,如果它处于等待期间,会从内核定时器队列中删除。如果定时器已经到期了并且在启动该定时期的线程有一个APC处于排队中,在线程APC队列中删除这个未执行的APC。 定时器的信号态(signaled state)不受影响。

示例:

// threadtest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
// 使用定时器
// 功能描述	:	等待定时器内核对象,等行三秒后开始输出,每隔一秒输出一次
#include <iostream>
#include <windows.h>
#include <process.h>
#include <stdio.h>
#include <mutex>

using namespace std;
int g_tickets = 100;
HANDLE g_hTimer;

unsigned int __stdcall fun1(LPVOID lpParamter)
{
	int nTime = 1;
	while (true)
	{
		WaitForSingleObject(g_hTimer, INFINITE);
		cout << "time:" << nTime++ << endl;
	}
	return 0;

}

int main()
{
	HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, fun1, nullptr, 0, nullptr);
	g_hTimer = CreateWaitableTimer(nullptr, FALSE, NULL);//FALSE表示自动定时器,只有一个线程可以执行
	const int nTimerUnitsPerSecond = 10000000;
	LARGE_INTEGER li;
	li.QuadPart = -(3 * nTimerUnitsPerSecond);// 开始时间,3s后
	SetWaitableTimer(g_hTimer, &li, 1000, nullptr, nullptr, FALSE);//1000表示,间隔1000ms
	getchar();
	CloseHandle(hThread);
	CloseHandle(g_hTimer);
	return 0;
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值