可等待定时器(获取系统时间)

可等待定时器这种内核对象,它们会在某个指定的时间触发,或每隔一段时间触发一次。它们通常用来在某个时间执行一些操作。

  

0x01 创建一个可等待定时器 CreateWaitableTimer

(在创建的时候,可等待的计时器对象总是处于未触发状态)

HANDLE WINAPI CreateWaitableTimer(

  __in_opt  LPSECURITY_ATTRIBUTES lpTimerAttributes, //安全描述符,为NULL时使用默认的

  __in      BOOL bManualReset, //要创建一个手动重置定时器还是一个自动重置计时器

//当手动重置计时器被触发时,正在等待该计时器的所有线程都会变成可调度状态

//当自动重置计时器被触发时,只有一个正在等待该计时的线程会变成可调度状态

  __in_opt  LPCTSTR lpTimerName //该可等待计时器的名称

);

0x02 获取一个已经存在的可等待计时器的句柄 OpenWaitableTimer

HANDLE WINAPI OpenWaitableTimer(

  __in  DWORD dwDesiredAccess, //访问权限

  __in  BOOL bInheritHandle, //是否允许子进程继承该句柄

    __in  LPCTSTR lpTimerName //要打开的对象名称

);

0x03 触发计时器 SetWaitableTimer函数

BOOL WINAPI SetWaitableTimer(

  __in      HANDLE hTimer, //想要触发的计时器

  __in      const LARGE_INTEGER *pDueTime, //计时器第一次触发的时间

  __in      LONG lPeriod, //第一次触发后,计时器的触发频度,当给lPeriod参数传0时,我们设置的是一次性定时器,这种定时器只触发一次,之后再不触发。

  __in_opt  PTIMERAPCROUTINE pfnCompletionRoutine, //异步过程调用APC函数

  __in_opt  LPVOID lpArgToCompletionRoutine, //APC函数的参数

  __in      BOOL fResume //是否继续执行,一般传FALSE

);

0x04  将指定的计时器取消 CancelWaitableTimer函数

BOOL WINAPI CancelWaitableTimer(

__in  HANDLE hTimer

);

这样计时器就永远不会触发了,除非以后再调用SetWaitableTimer来对它进行重置。如果想要改变触发器的触发时间,不必先调用CancelWaitableTimer,因为每次调用SetWaitableTimer都会在设置新的触发时间之前将原来的触发时间取消掉。

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

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <ctime>
using namespace std;

DWORD WINAPI ThreadProcedure(LPVOID ParameterData);
void GetSystemTime();
BOOL __IsLoop = TRUE;
int main()
{
	HANDLE ThreadHandle = CreateThread(NULL, 0,
		(LPTHREAD_START_ROUTINE)ThreadProcedure, NULL, 0, NULL);
	printf("Input AnyKey To Exit\r\n");
	getchar();

	__IsLoop = FALSE;

	WaitForSingleObject(ThreadHandle, INFINITE);

	if (ThreadHandle!=NULL)
	{
		CloseHandle(ThreadHandle);
		ThreadHandle = NULL;
	}

    return 0;
}
DWORD WINAPI ThreadProcedure(LPVOID ParameterData)
{
	//创建一个时钟
	HANDLE TimeHandle = NULL;
	LARGE_INTEGER DueTime;
	DueTime.QuadPart = -10000000;
	TimeHandle = CreateWaitableTimer(NULL, FALSE, NULL);
	//同步事件(SynchronizationEvent)
    //当事件对象为激发时,如遇到KeWaitForXX等内核函数,事件对象则自动变回未激发态
    //通知事件(NotificationEvent)
    //当事件对象为激发时,如遇到KeWaitForXX等内核函数,事件对象则不会变回未激发态
	//If this parameter is TRUE, the timer is a manual-reset notification timer. Otherwise, the timer is a synchronization timer.
	while (__IsLoop)
	{
		if (!SetWaitableTimer(TimeHandle, &DueTime,
			0, NULL, NULL, 0))
		{
			printf("SetWaitableTimer failed (%d)\n", GetLastError());
			return 0;
		}
		BOOL IsOk = WaitForSingleObject(TimeHandle, INFINITE);
		IsOk -= WAIT_OBJECT_0;
		if (IsOk==0)
		{
			system("cls");
			GetSystemTime();
		}
		else
		{
			break;
		}
	}
	CancelWaitableTimer(TimeHandle);
	CloseHandle(TimeHandle);
	TimeHandle = NULL;
	printf("ThreadProcedure() Exit\r\n");
	return 0;
}
void GetSystemTime()
{
	char TimeData[MAX_PATH] = { 0 };
	auto TimeObject = time(NULL);
	tm v1;
	localtime_s(&v1, &TimeObject);
	//格式化时间字符串
	strftime(TimeData, _countof(TimeData), "%Y-%m-%d %H:%M:%S", &v1);
	printf("%s\r\n", TimeData);
}

  

时间: 2024-10-22 06:16:55

可等待定时器(获取系统时间)的相关文章

Java获取系统时间少了八个小时

Java获取系统时间少了八个小时 今天忽然遇到需要获取当前时间的问题,我向来谨慎,先测试获取到的系统时间是否正确,结果竟然发现少了八个小时,晕死了,记得之前在页面用javascript获取过当前时间,都能正确获取的.然后开始上网查,更晕了,答案各种各样,有用代码的方式(这肯定不行,因为程序不只要在自己的机子上跑的),也有修改eclipse和tomcat安装文件的,更有修改注册表的,NND,还真不知要用哪个,后来,终于找到一个,说问题出在JRE上,我很认同,一试,果然行!下面附上步骤,希望给遇到同

JAVA中获取系统时间

一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowString {public static void main(String[] args) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式System.out.println(df.forma

Android获取系统时间方法详解

Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar.getInstance()函数获取一个实例,再为该实例设定时区(中国的时区为GMT+8:00),最后使用Calendar.get()函数获取时间的具体信息,如年,月,日,小时,分,秒,星期几. package com.hzhi.time_example; import java.util.Cale

C++11新特性,利用std::chrono精简传统获取系统时间的方法

一.传统的获取系统时间的方法 传统的C++获取时间的方法需要分平台来定义.相信百度代码也不少. 我自己写了下,如下. const std::string getCurrentSystemTime() { if (PLATFORM_ANDROID || PLATFORM_IOS) { struct timeval s_now; struct tm* p_tm; gettimeofday(&s_now,NULL); p_tm = localtime((const time_t*)&s_now.

Oracle中ID的自动增加以及获取系统时间的小技巧

引自http://blog.csdn.net/lejuo/article/details/4479065 ID自动增加,就像MS- SQL Server里面创建表格时,给表的主键设置为自动增加一样. 在Oracle里面,通过如下的SQL语句实现:(plsql可以直接在sequence创建) -- Create sequence create sequence MSG_IN_ID_SEQminvalue 1maxvalue 999999999999999999999999999start with

获取系统时间的DOS命令

DOS C:\Users\yaozhendong>echo %date:~0,10% %time%2011/12/24 19:45:41.25 前段时间工作中需要对一个地址做定时PING操作,并将结果输出到TXT文件中,为此做了个批处理文件,用到了获取系统时间的DOS命令“%date%”“%time%”.下面把具体使用方法记录如下 文件内容示例: “echo %date% %time%>>d:\bmw\ping%date:~0,10%_%time:~0,2%.%time:~3,2%.tx

Linux驱动中获取系统时间

最近在做VoIP方面的驱动,总共有16个FXS口和FXO口依次初始化,耗用的时间较多.准备将其改为多线程,首先需要确定哪个环节消耗的时间多,这就需要获取系统时间. #include <linux/time.h> /*头文件*/ struct timeval time_now; unsigned long int time_num;//获取的时间 do_gettimeofday(&time_now); time_num = time_now.tv_sec*1000+time_now.tv

获取系统时间&amp;&amp;获取程序某一段执行时间

获取系统时间: CTime  _time; CString m_SystemTime("");  _time=CTime::GetCurrentTime();  m_SystemTime=_time.Format("%Y-%m-%d  %H:%M:%S"); 获取程序某一段执行时间: DWORD  betime(0),endtime(0),sumtime(0); int i=0; betime=GetTickCount(); while(i<10) {  Sl

如何在jsp页面获取系统时间

<%@ page import="java.util.*"%> //获取系统时间必须导入的 <%@ page import="java.text.*"%> //获取系统时间必须导入的 String datetime=new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); //获取系统时间  

VC++ 获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法

1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 str=tm.Format("现在时间是%Y年%m月%d日 %X"); MessageBox(str,NULL,MB_OK); a,从CTimet中提取年月日时分秒 CTime t = CTime::GetCurrentTime(); int d=t.GetDay(); //获得几号 int y=t.