1. 如果做游戏开发,为了时间单独写一个线程不太划算,CreateWaitableTimerA之类的是内核对象,因为多个时钟都有同一个名称,就可以让多个线程同时读取一个时钟。。
2. 如果要用到多个定时器,应该设定好每个定时器的名字,如果是匿名那就只能是一个。
#include<stdio.h> #include <stdlib.h> #include <Windows.h> int main() { HANDLE time1 = CreateWaitableTimerA(NULL, TRUE, "haihua"); if (time1==NULL) { printf("创建失败"); } LARGE_INTEGER mytime; //大整数,其本质是一个结构体 mytime.QuadPart = -50000000; //单位是0.1微秒,设置为5秒之后启动定时器。 if (!SetWaitableTimer(time1,&mytime,0,0,0,0)) { printf("设置失败"); } if (WaitForSingleObject(time1,INFINITE)==WAIT_OBJECT_0) { //如果等于WAIT_OBJECT_0,意味着得到消息。 printf("wait ok"); } else { printf("wait no"); } system("pause"); }
时间定时器还允许回调函数
#include<stdio.h> #include <stdlib.h> #include <Windows.h> //函数指针作为参数,他调用的函数就是回调函数。 VOID CALLBACK timerun(void *parg,DWORD timearg,DWORD timehigh) { DWORD dwindex = *(DWORD *)parg; printf("\n第%d次", dwindex); //MessageBoxA(0, "1", "2", 0); } int main() { HANDLE time1 = CreateWaitableTimerA(NULL, TRUE, "haihua");//创建始终 if (time1 == NULL) { printf("创建失败"); } LARGE_INTEGER mytime; mytime.QuadPart = -50000000; //0.1微妙, DWORD dwparam = 1;//设置定时器 if (SetWaitableTimer(time1, &mytime, 3000, timerun, &dwparam, FALSE)) { //3000,表示3000毫秒执行一次循环。 printf("等待5秒开始干活"); for (int i = 0; i < 15; i++, dwparam++)//循环多少次 { SleepEx(INFINITE, TRUE); } } CancelWaitableTimer(time1);//取消定时器 CloseHandle(time1); system("pause"); }
时间: 2024-08-24 18:08:29