查看以下代码:
DWORD WINAPI TimerThrd(LPVOID lpParameter)
{
MSG msg;
HANDLE hTimer;
LARGE_INTEGER li = {0}; // Create an auto-reset timer.
hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
const int nSecond = 10000000;
        //3秒进行一次报时
SetWaitableTimer(hTimer, &li, 3* 1000,NULL, NULL, FALSE); while (WaitForSingleObject(hTimer,INFINITE) == WAIT_OBJECT_0)  //内核hTimer变成已通知状态
{
               
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
if (msg.message == WM_QUIT) 
break; //线程退出
}
else {
                        //内核hTimer变成已通知状态后,开线程处理些事务
HANDLE hddeal = CreateThread(NULL, 0, Dosomething, NULL, NULL, NULL);
CloseHandle(hddeal);
}
}
return 0;
}
这里我如果要结束这个线程的话,暂时用的办法是:PostThreadMessage(TimerThrd的线程ID,WM_QUIT,0,0).
那么要等到定时器内核对象hTimer变为通知,然后收到WM_QUIT才能退出。
我现在想即时让线成终止(本来想用ExitThread,但会造成该线程里的资源不能释放),有什么方法能实现么?

解决方案 »

  1.   

    DWORD x=WaitForSingleObject(hTimer,0)
    消息
    {if(x=WAIT_OBJECT_0)



    不等时间,消息优先吗..
      

  2.   

    用MsgWaitForMultiObjects,在有信号或者有消息时都会马上返回。
      

  3.   

    while (WaitForSingleObject(hTimer,INFINITE) == WAIT_OBJECT_0)
    这里每隔3S内核ShTimer就变成已通知状态,是个循环。按你的意思是就是只等一次hTimer吧!
      

  4.   

    可以先看下 MsgWaitForMultiObjects 函数的参数看看。
      

  5.   

    例如:
    while(1)
    {
       DWORD x=WaitForSingleObject(hTimer,0); 测试对象立刻返回
       PeekMessage(&msg,NULL,0,0,PM_REMOVE);
       if (msg.message == WM_QUIT)break; //线程退出
        if(x==WAIT_OBJECT_0)信号态处理
    {
    ...........
    }
    }
    就是不等hTimer
      

  6.   

    2楼正解!5楼的方法虽可以,但是比较耗系统资源:测试对象立刻返回后循环,没有把时间片让给系统。但还是感激!!!
    这是改后的代码:
    DWORD WINAPI TimerThrd(LPVOID lpParameter)
    {
    MSG msg;
    HANDLE hTimer,hddeal;
    LARGE_INTEGER li = {0}; // Create an auto-reset timer.
    hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
    const int nSecond = 10000000;
    //3秒进行一次报时
    SetWaitableTimer(hTimer, &li, 3* 1000,NULL, NULL, FALSE); while (1)  //内核hTimer变成已通知状态
    {
            DWORD dwResult = MsgWaitForMultipleObjects(1,&hTimer,FALSE,INFINITE,QS_ALLEVENTS);
    switch(dwResult) 
    {
    case WAIT_OBJECT_0:    // The event became signaled. //内核hTimer变成已通知状态后,开线程处理些事务
    hddeal = CreateThread(NULL, 0, Dosomething, NULL, NULL, NULL);
    CloseHandle(hddeal);
    break;
    case WAIT_OBJECT_0 + 1:  // A message is in our queue.
    if (PeekMessage(&msg,NULL,0, 0, PM_REMOVE)) {
    if (msg.message == WM_MYMSG)
    return 0; //线程退出
    }
    break;
    }
    }
    return 0;