我们用到多很多函数都可以设置超时,但我现在就是想弄明白,象这样的函数到底该怎么写!

解决方案 »

  1.   

    超时的函数设计要牵涉到WINDOWS内核资源,例如事件函数:::WaitForSingleObject(m_hEventReadBuff,INFINITE);我还没见过谁写出来的,同感!!
      

  2.   

    这个我知道!但是我想自几写个带超时的函数!
    例如,我要写个函数用遍历硬盘寻找某个文件,但是还要设置个超时,例如超过60秒就放弃,RETURN FALSE;
      

  3.   

    我倒是有一个思路:超时的函数TimeOutFunction()和一个线程DoWhatYouDoThread(LPVID nParam)来实现:
    HANDLE m_hEventTimeOut = CreateEvent(NULL,FALSE,FALSE,NULL);//开始信号为无int TimeOutFunction()
    {
    //启动一个线程做你想要做的事
    AfxBeginThread(DoWhatYouDoThread , (LPVOID)nParam);    if(WaitForSingleObject(m_hEventTimeOut ,nTime)!=WAIT_OBJECT_0)
    {//超时等返回
    return -1;
    }
        else
        {//正常返回
    return 1;
        }}UINT DoWhatYouDoThread(LPVID nParam)
    {
    if(做完了....)
    {
    //设置有信号表示TimeOutFunction()可以马上返回啦。
    SetEvent(m_hEventTimeOut);
    }
    else
    {
    //继续做吧
    } //如果没做完TimeOutFunction()也已经超时返回,那你看着办怎样处理本线程}成功了请客!!
      

  4.   

    zxiaox(呆呆2002),非常感谢!
    这种方法我以前也用过,虽然她也可以起到超时的效果,但是这个函数还是不能用在主线程中,以为在主线程中一但WaitForSingleObject,主线程就处于等待状态,其他的消息响应就停止了,例如我本来是想对串口超作,写个超时函数来对串口通信,结果用了这个函数,在WaitForSingleObject之后,主线程就停止了其他的响应,包括串口的响应!
      

  5.   

    用MsgWaitForMultipleObjectsEx,可以在等待信号灯过程中进行消息循环,下面是<atlbase.h>中的某段代码,可供你参考:
    ATLINLINE ATLAPI_(BOOL) AtlWaitWithMessageLoop(HANDLE hEvent)
    {
      DWORD dwRet;
      MSG msg;
      while(1)
      {
        dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, INFINITE, QS_ALLINPUT);
        if (dwRet == WAIT_OBJECT_0)
          return TRUE;    // The event was signaled
        if (dwRet != WAIT_OBJECT_0 + 1)
          break;          // Something else happened
        // There is one or more window message available. Dispatch them
        while(PeekMessage(&msg,0,0,0,PM_NOREMOVE))
        {
          // check for unicode window so we call the appropriate functions
          BOOL bUnicode = ::IsWindowUnicode(msg.hwnd);
          BOOL bRet;
          if (bUnicode)
            bRet = ::GetMessageW(&msg, NULL, 0, 0);
          else
            bRet = ::GetMessageA(&msg, NULL, 0, 0);
          if (bRet > 0)
          {
            ::TranslateMessage(&msg);
            if (bUnicode)
              ::DispatchMessageW(&msg);
            else
              ::DispatchMessageA(&msg);
          }
          if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
            return TRUE; // Event is now signaled.
        }
      }
      return FALSE;
    }
      

  6.   

    1.同意:arxing(阿行)的说法,这是一个可以解决主线程对其它事件的一个响应办法 。2.如果是对串口操作的话,我觉得应该分别开启两个CWinThread线程进行读写,然后通过::PostThreadMessage()对线程进行通讯和控制,建议在主线程避免有阻塞和耗时的函数调用。
      

  7.   

    MsgWaitForMultipleObjects()是个好的决绝方案。
    既不遗漏消息,又可以等待对象。
      

  8.   

    嗯,差不多该揭帖了!
    就用这个MsgWaitForMultipleObjects