关于定时器

lzxjxsy 2006-12-01 06:52:53
各位大哥,关于定时器的实现和应用,请大家帮我看看,下面两段代码有什么不同,为什么一个能实现定时功能,一个不能实现.

不能实现的如下:
#include <windows.h>
#include <process.h>
#include <stdio.h>
VOID CALLBACK TimerHandler( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
printf("ok!\n");
}

class clsTimer{
public:
static int setOneTimer(int nInterval, TIMERPROC taskFun);
void start();

static void gTaskThreadFunc(LPVOID pParam);
};

void clsTimer::start()
{

Sleep(1000);
_beginthread(gTaskThreadFunc, 0, NULL);
}

void clsTimer::gTaskThreadFunc(LPVOID pParam)
{
// setOneTimer(1000, (TIMERPROC)TimerHandler);
while(true)
{
MSG message;
Sleep(1);
while (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
}

int clsTimer::setOneTimer(int nInterval, TIMERPROC taskFun)
{
return SetTimer(NULL, 0, nInterval, taskFun);
}

int main()
{
clsTimer ct;
ct.setOneTimer(1000, (TIMERPROC)TimerHandler);
ct.start();

while(1)
{
Sleep(1000);
}
return 0;
}


能实现的如下:
#include <windows.h>
#include <process.h>
#include <stdio.h>
VOID CALLBACK TimerHandler( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
printf("ok!\n");
}

class clsTimer{
public:
static int setOneTimer(int nInterval, TIMERPROC taskFun);
void start();

static void gTaskThreadFunc(LPVOID pParam);
};

void clsTimer::start()
{

Sleep(1000);
_beginthread(gTaskThreadFunc, 0, NULL);
}

void clsTimer::gTaskThreadFunc(LPVOID pParam)
{
setOneTimer(1000, (TIMERPROC)TimerHandler);
while(true)
{
MSG message;
Sleep(1);
while (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
}

int clsTimer::setOneTimer(int nInterval, TIMERPROC taskFun)
{
return SetTimer(NULL, 0, nInterval, taskFun);
}

int main()
{
clsTimer ct;
// ct.setOneTimer(1000, (TIMERPROC)TimerHandler);
ct.start();

while(1)
{
Sleep(1000);
}
return 0;
}

拜托大家了,如果解答得好,兄弟再开贴给分,绝不食言。两段代码的区别是setOneTimer(1000, (TIMERPROC)TimerHandler); 的位置不同


...全文
229 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiChenYue 2007-01-26
  • 打赏
  • 举报
回复
同意当前线程
liuqiyc 2006-12-05
  • 打赏
  • 举报
回复
If hWnd is NULL, PeekMessage retrieves messages for any window that belongs to the current thread. If hWnd is INVALID_HANDLE_VALUE, PeekMessage retrieves messages whose hWnd value is NULL, as posted by the PostThreadMessage function.
----------------------------------------
只说是当前线程(current thread),没有说是整个应用程序。不知道你在哪儿看的?
lzxjxsy 2006-12-05
  • 打赏
  • 举报
回复
不行,只要在不同的线程,就不能相应。必须放在同一个线程才能响应,我想问为什么?
liuqiyc 2006-12-01
  • 打赏
  • 举报
回复
SetTimer()设置一个定时器,当时间到时,向创建线程发送 WM_TIMER 消息

上面那个程序 SetTimer 在主线程 main 中调用,WM_TIMER 消息发往主线程,而主线程没有从消息队列中取出 WM_TIMER 消息,也就不会对 WM_TIMER 进行响应,所以 TimerHandler 不会执行

下面的 SetTimer 在线程 gTaskThreadFunc 中调用,WM_TIMER 消息发往 gTaskThreadFunc 线程,gTaskThreadFunc 中有消息分发,所以会对 WM_TIMER 进行响应,执行 TimerHandler
--------------------------------------------------

对上面那个程序,将
MSG message;
Sleep(1);
while (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
放到main中,就可以看到输出了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧