用CreateThread建立一个线程
在线程中用GetTickCount自己做循环计时,这样比用定时器好。
GetTickCount()放在 OnIdle消息下吗?
循环检测太耗CPU了,还是在检测的线程中等待一个永不发生的事件,并把超时设为你期望的时间比较好:
DWORD WINAPI DetectThreadProc(LPVOID lpParam)
{
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
DWORD dwTimeOut = 60000; // 你期望的时间间隔
DWORD dwDelay = 0;
while( !bFinish )
{
DWORD dwLoopStart = GetTickCount();
WaitForSingleObject(hEvent, dwTimeOut-dwDelay);
...
dwDelay = GetTickCount()-dwLoopStart; // 补偿检测处理所花的时间
}
}
请问WHQ,后台进程要不断地等待每隔TimeOut 后所触发的消息,应怎样处理?
关注
用用户线程代替工人线程
首先肯定不能用循环的方法,否则在95/98这种非真正独占式操作系统中会严重降低系统性能,我在去年一个 very time critical 的项目中碰到了精确到1毫秒的要求,我用的是
Multimedia Timers.
Multimedia Timers的详情可以从MSDN中查到,它是通过设定分辨率后,按你要求的时间定期调用你的回调函数,你只需先创建一个全局的事件,然后在你的回调函数每次被调用时signal此事件.同时在你的后台运行的Thread中WaitForSingleObject此事件即可.一旦WaitForSingleObject返回WAIT_OBJECT_0,则你等到时间了.记住在这儿把你的全局的事件unsignal再继续
在循环中加一句:
Sleep(1);
就可以降低后台循环检测线程对CPU的占用率。
使用多媒体定时器timeSetEvent,它运行于自己的线程中,刚好符合你的后台定时器要求。
建议开启界面线程使其拥有自己的消息队列,在其中建立定时器并编写定时器调用代码,
然后发消息到你自己的主线程的消息队列中。
我写的那段代码不已处理了吗?你看一个WaitForSingleObject函数的说明就明白了
这很简单,我的程序里是这么用的:
UINT IDOfTimer=::SetTimer(NULL,1,1000*2,TimerProc);
注意第一个参数为NULL
void CALLBACK TimerProc(
HWND hwnd,
UINT uMsg,
UINT idEvent,
DWORD dwTime )
{}
千万不要用循环,如果你使用循环,你马上就会耗尽CPU
结果就是死机
我的这段代码工作的很好,消耗的CPU极少
WaitForSingleObject不如Sleep
顺便提醒一下,win9x中的缺省定时器间隔约50ms。