C/C++ 学习之 定时器

下面是两个简单的例子,说明在  windows  控制台应用程序中定时器的用法

1、直接声明回调函数,然后在回调函数中处理消息。

// programe for timer

#include "stdio.h"
#include "conio.h"
#include <Windows.h>

int count = 0;

void CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
	printf("WM_TIMER in work thread count = %d\n",count++);
}

int main()
{
	SetTimer (NULL, 0, 1000, TimerProc);
	MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
		if(msg.message==WM_TIMER)
		{
			DispatchMessage(&msg);
			if(count == 7)
			{
				printf("should stop!\n");
				break;
			}
		}
    }
	KillTimer (NULL, 0);
	return 0;
}

2、建立线程,在线程中建立消息处理机制

//programe for timer
#include   <windows.h>
#include   <stdio.h>
#include   <conio.h>  

unsigned   long   WINAPI   Thread(PVOID   pvoid); 

void   main()
{
    DWORD   dwThreadId;
    printf("控制台应用程序:线程-定时器\n");
    HANDLE hThread = CreateThread(NULL, 0, Thread, 0, 0, &dwThreadId);
	//安全等级,默认栈空间,线程名,线程参数,编程标志,线程ID       

    DWORD   dwwait = WaitForSingleObject(hThread,1000*30);
    switch(dwwait)
    {
    case   WAIT_ABANDONED:
        printf("main thread WaitForSingleObject return WAIT_ABANDONED\n");
        break;
    case   WAIT_OBJECT_0:
        printf("main thread WaitForSingleObject return WAIT_OBJECT_0\n");
        break;
    case   WAIT_TIMEOUT:
        printf("main thread WaitForSingleObject return WAIT_TIMEOUT\n");
        break;
    }
    CloseHandle(hThread);
    getch();
}  

unsigned  long   WINAPI   Thread(PVOID   pvoid)
{
    MSG   msg;
    PeekMessage(&msg,   NULL,   WM_USER,   WM_USER,   PM_NOREMOVE);
	//该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。
	//接收消息的 MSG 结构指针,句柄,指定被检查的消息范围里的第一个消息,最后一个,确定消息如何被处理
	//PM_NOREMOVE,PeekMessage处理后,消息不从队列里除掉
	//PM_REMOVE,PeekMessage处理后,消息从队列里除掉
	//PM_NOYIELD,此标志使系统不释放等待调用程序空闲的线程
    UINT   timerid = SetTimer(NULL,111,1000,NULL);
    BOOL   bRet;
    int   count = 0;
    while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        if(bRet == -1)
        {
            //   handle   the   error   and   possibly   exit
        }
        else if(msg.message == WM_TIMER)
        {
            printf("WM_TIMER in work thread count = %d\n",count++);
            if(count>4)  break;
        }
        else
        {
            TranslateMessage(&msg);
			//将虚拟键消息转换为字符消息,下一次线程调用函数GetMessage或PeekMessage时被读出。
            DispatchMessage(&msg);
			//该函数分发一个消息给窗口程序,消息传递给操作系统,然后操作系统去调用我们的回调函数
        }
    }
    KillTimer(NULL,timerid);
    printf("thread  end  here\n");
    return   0;
}
时间: 2024-11-05 17:40:26

C/C++ 学习之 定时器的相关文章

JavaScript学习05 定时器

JavaScript学习05 定时器 定时器1 用以指定在一段特定的时间后执行某段程序. setTimeout(): 格式:[定时器对象名=] setTimeout(“<表达式>”,毫秒) 功能:执行<表达式>一次. 例子: <!DOCTYPE html> <html> <head> <title>timer1.html</title> <meta http-equiv="keywords" co

boost asio 学习(六) 定时器

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=7 6 定时器 boost::asio 提供了一个 deadline_timer class来提供同步与异步的接口. BOOST文档提供了一组优秀示例.第一个例子,将创建一个间隔5秒的定时器. #include <boost/asio.hpp> #include <boost/shared_ptr.hpp&

Go组件学习——cron定时器

1 前言 转到Go已经将近三个月,写业务代码又找到了属于Go的条件反射了. 后置声明和多参数返回这些Go风格代码写起来也不会那么蹩脚,甚至还有点小适应~ 反而,前几天在写Java的时候,发现Java怎么启动这么慢,Java怎么能够容忍这些用不到的代码还理直气壮的躺在那……等等,这些话在哪听过类似的??? “Go为什么要后置声明,多别扭啊” “Go里面为啥要定义这么多的struct,看的头晕” …… 其实,没有最好的语言,只有最适合的. 前面<Go语言学习>系列主要介绍了一些Go的基础知识和相较

【JS学习】定时器

一.定时器的作用 (1)开启定时器 setInterval 间隔型 setTimeout 延时型 两种定时器的区别 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml&

quick-cocos2d-x学习笔记—定时器

定时器用的地方还是比较多的,游戏中的逻辑判断很多都是采用每帧执行.quick对于schedule的封装在scheduler这个lua文件中.如果是第一次接触quick的话,可能按照官方的api来写一个定时器被报错,提示schedule是一个nil值,这是因为其他的模块在初始化时都是被加载的,唯独这个scheduler没有载入,所以在使用的时候,第一件事是引入这个模块, [html] view plain copy local scheduler = require("framework.sche

Qt学习 之 定时器

在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. QObject类的定时器 QObject是所有Qt对象的基类,它提供了一个基本的定时器.通过QObject::startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符.这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject

《Linux设计与实现》学习笔记——定时器和时间管理

基本概念 系统定时器 一种可编程硬件芯片,能够以固定频率产生中断,定时器中断,他的中断处理程序负责更新系统时间,负责执行需要周期性运行的任务. 触发中断的频率即节拍率,可以编程预定. 动态定时器 一种用来推迟执行程序的工具 HZ 系统定时器的频率(节拍率)是静态预处理定义的. HZ数大小确定应考虑的因素: HZ越高: 优势:提高时间驱动事件的准确度:调度的粒度更细,进程抢占更准确: 内核定时器以更高的频度和准确度执行. 劣势:节拍率越高,时钟中断程序占用处理器时间越多:并且频繁打乱处理器cach

FFmpeg 学习之 定时器解码两路视频并进行对比&lt;2&gt;

前面写过一篇关于视频对比的文章,后来又做了一些修缮,用代码实现了一遍. //定时器,解码 void Cvideo4Dlg::OnTimer(UINT nIDEvent) { //输出视频解码 WaitForSingleObject(AfxBeginThread(Decode_out_Thread, this), INFINITE); //输入视频解码 WaitForSingleObject(AfxBeginThread(Decode_in_Thread, this), INFINITE); //

GTK进阶学习:定时器

定时器在应用编程里用得很广,我们手机里的闹钟,幻灯片播放图片等应用都用到定时器.定时器,每隔一段时间干一件事(程序里表现为调用一个函数),像闹钟,每隔一天响一次. 定时器的创建: guint g_timeout_add(guint interval, GSourceFunc function, gpointer data); interval:设置的时间间隔,以毫秒为单位( 1000即为1秒 ) function:回调函数的名字 data:给回调函数传的参数 返回值:定时器id号 使用实例: g