自己写的类,怎么样用 settimer()定时器...
我的类,没有从任何基类继承.......
我该怎么做??......................
谢谢提供资料和方法..................
我的类,没有从任何基类继承.......
我该怎么做??......................
谢谢提供资料和方法..................
解决方案 »
- IsWindow() : Unhandled exception
- 为啥我更新数据库的时候出错?在线等待,参与有分
- 我要写一个数据中转程序的服务端,请大家帮忙看看思路是否可行(代码有点长,麻烦各位花5分钟看完)
- 菜鸟提问:如何知道鼠标移出了程序窗口?
- 关于cstring::find()
- 在自己生成的类里加计时器
- 急救!VC数据库问题。。。。。。
- 调试vc程序程序时出现0x7c931980引用0x00000000内存出错!!请高手帮看看!!急!
- 网络视频编程讨论
- 请教CHtmlView
- 如果要在ListCtrl中当鼠标移动到第2列的时候改变鼠标的形状,该怎么做?
- [南京程序员俱乐部]:程序员的你生活中找到了另一半了么?
UINT_PTR nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);SetTimer(NULL,1,1000,TimerProc)
写个static的成员函数TimerProc
VOID static CALLBACK TimerProc( HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
);
如楼上所说,使用这种方式,就不需要再去定义消息映射了,在一定时间内,会自动调用你的回调函数。
你只需要把处理代码放在回调函数里面即可。
回调函数会是程序的逻辑性比较强,比在CWnd里头的OnTimer看着舒服一些
CCmdTarget派生的类才支持消息映射.不想派生的话,用API: ::SetTiemr
{
while(1)
{
Sleep(3000);
DoYouSelf();
}
}一样完成定时器功能。
如果程序中定时器修改的数据是和另外线程共有的,请不要用系统提供的OnTimer处理,否则容易发生死锁现象,还是用自己写的定时程序好。
放在CPP文件头上要定义一下
1. 可以在你的类里建一个隐藏的窗口,仅仅接收WM_TIMER消息.
2. 自己写也可以实现,不过比较复杂,大致思路如下:
建立一个定时器表,大致结构如下:
struct _tagTimerTableItem
{
int nTick ; //已经记数的时间长度 >= nInterval是调用 pfnTimerProc
int nTimerID;//时间ID 注意必须唯一
uint nInterval; //时间间隔
void (*pfnTimerProc )();//一个指向你的时间到处理函数的 函数指针
}TIMETABLEITEM;
TIMETABLEITEM timetable[100];//100不够再加,或者改成动态数组也行
memset(timetable, 0, sizeof(timetable));定义你的SetTimer函数:
SetTimer(int nTimerID, uint, nInterval, void (CALLBACK *lpfnTimerProc(void ))
{
//先查找时间表里有没有ID=nTimerID的项,有就修改其参数,
//没有就找一个timetable[nTimeTableItemIndex].nTimerID=0的项,修改其参数为:
timetable[nTimeTableItemIndex].nTick = 0;
timetable[nTimeTableItemIndex].nTimerID = nTimerID;
timetable[nTimeTableItemIndex].nInterval= nInterval;
timetable[nTimeTableItemIndex].pfnTimerProc = lpfnTimerProc;
}
KillTimer(int nTimerID);
{
//先查找时间表里有没有ID=nTimerID的项,有就
memset(&timetable[nTimeTableItemIndex], 0, sizeof(timetable[nTimeTableItemIndex]);
}
建立一个线程,以一个比较小的时间单位为间隔(比如说1ms),查询
void timerthread(void *lpvoid)
{
int i= 0 ;
while(WaitForSingleObject(hEnentExit, 1)== Wait_timeout)
{
for( i = 0 ;i < 100; i ++ )
{
if ( timetable[i].nTimerID==0)
continue;
timetable[i].nTick ++ ;
if ( timetable[i].nTick >= timetable[i].nInterval )
{
timetable[i].nTick = 0 ;
timetable[i].pfnTimerProc();
}
}
}
}如果考虑周详点,可以对timetalbe加上互斥锁.
大致思路就是这样了可以不用窗口句柄,但要注意timetable里的nTimerID须互不相同,因为用它来区分不同的类