OnIdle()调用用户界面线程,该线程是否结束?
是否阻塞?

解决方案 »

  1.   

    我的意思是 在线程的OnIdle()中做一些操作,
      

  2.   

    没有用sleep()。   我跟踪到 CWinThread->Run()->PumpMessage()->GetMessage() 时被阻塞了!!!
      

  3.   

    重载Run吧,OnIdle只在线程idle时才被调用,要进入的idle状态,要没有 鼠标移动/WM_PAINT/WM_SYSTIMER 消息才行,参考一下CWinThread::Run修改重载的Run:
    int CXXXThread::Run()
    {
    ASSERT_VALID(this); // acquire and dispatch messages until a WM_QUIT message is received.
    for (;;)
    {
    // 如果消息队列内没有消息,在这儿后台处理:
    while (!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
    {
                         //后台处理
    }
    // 如果有消息,循环处理完所有消息
                      while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_REMOVE))
    {
                              if( m_msgCur.message == WM_QUIT )
             return ExitInstance();
                              ::TranslateMessage(&m_msgCur);
            ::DispatchMessage(&m_msgCur);
    } } ASSERT(FALSE);  // not reachable
    }
    由于简便,我去掉了对idle状态的处理,这样线成的所有窗口就收不到WM_IDLEUPDATECMDUI消息调用OnUpdateCmdUI()更新菜单(在菜单弹厨师还是会更新的),如果需要参考CWinThread::Run加吧。
      

  4.   

    忘了加一句,PeekMessage是非阻塞的
      

  5.   

    to  In355Hz(好象一条狗) :高手,果然是高手,接分!!!!!