如何利用线程创建计时器(C++,或是C语言)
我想用纯C++或是C语言创建一个计时器,是利用线程的,但是从没接触过这个,
只是用MFC设定过,所以一点头绪都没有,请教高人指点一下。
[解决办法]
一般都是外部注册定时器和回调函数到一个队列
定时器线程检测队列的定时任务是否到了,然后调用回调函数
[解决办法]
。。 再一遍,不知道啥叫 c++或者c言的。 c,c++的用就是建立在的使用上的,包括win32 api ,mfc,等等。
程西是跟操作系相的。在Windows上,就是利用CreateThread建一程。并且再程里面就可以了。
然,win32也提供了SetTimer的函,一般不需要自己定器。
[解决办法]
如果不太要求精度用Sleep呀。虽然各OS里Sleep功能的函数名字会有不同。
while(1)
{
Sleep(100);
对所有Timer刷新计时值,
时间到的就调回调函数或者发消息给它。
}
[解决办法]
有个例子楼主自己看看吧:
//利用中断实现每500毫秒接收一次数据
//调用DOS下的中断。
//DOS的时钟中断 int 21H AH=0x1C 每秒产生18.2次中断
//该程序时间间隔为550毫秒 可以由count的值算出。
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#define INTR 0X1C //0x1c为时钟中断
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
void interrupt ( *oldhandler)(__CPPARGS);
int count=0;
int a=0,b=0;
struct time t;
void interrupt handler(__CPPARGS) // 执行DOS中断时调用的程序
{
count++;
if(count==10)
{ gettime(&t);
b=t.ti_hund;
printf( "(2) %d\n ",b);
if(b <a)printf( "Delay %d ms ",((100-a)+b)*10);
else printf( "Delay %d ms ",(b-a)*10);}
}
int main(void)
{
oldhandler = getvect(INTR); //取得原来的中断向量
setvect(INTR, handler); //设置现在的中断向量
gettime(&t);a=t.ti_hund;
printf( "(1) %d\n ",a);
while (count < 11); //循环等待。执行DOS的时钟中断
setvect(INTR, oldhandler); //执行完毕,恢复原来的中断向量
return 0;
}
[解决办法]
我可以回公司 看看 公司的平台代码 ,实现 linux,windows,vworks 等多平台的定时器......
前段时间看了下windows下的实现,大概实现是这样的, 起一个定时器和消息队列,起一个线程 不停的读取当前时间,然后通过定时器队列(这个队列设计是有讲究的,是时间长短排序的,只要找个一个超时,那么他前面的自然就超时了) .. 超时时 放入 消息队列. 消息对列 就如merlinfang(merlinfang) 所说的, 注册回调函数 .....
可以用api 函数读取当前时间, 也可以用 硬中断,读取cpu的tick 数 计算当前时间.