Be careful when using Sleep and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. If you have a thread that uses Sleep with infinite delay, the system will deadlock. Two examples of code that indirectly creates windows are DDE and COM CoInitialize. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than Sleep.

解决方案 »

  1.   

    你是在主线程中使用Sleep()?
    如果只是想隔一段时间再执行其它代码的话,可以用计时器,SetTimer()
      

  2.   

    MSG msg;
    while(PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE)
    {
    Sleep(100)
    }
      

  3.   

    如果是在主线程中,你频繁暂停话,程序设计有问题;如果在子线程中,使用sleep()就行了。
      

  4.   

    你可以用定时器。。sleep这个最好不要使用。。
      

  5.   

    使用定时器是个比较简单的做法,线程不要堵死,Sleep会堵死线程
      

  6.   

    这我最近有研究到,想出了三种方法方法一:利用线程方法,不过我对线程不熟,不知道如何提前结束正在 Sleep() 的线程
    struct Sleep1_struct
    {
    HANDLE hEvent;
    int nSleepTime;
    };UINT Sleep1Thread(LPVOID pWaitTime)
    {
    Sleep1_struct * sleep = (Sleep1_struct *)pWaitTime;
    Sleep(sleep->nSleepTime);
    SetEvent(sleep->hEvent); //休眠结束后, 设为有讯号
    return 0;
    }void CEventImporterUIDlg::Sleep1(unsigned long nWaitTime)
    {
    Sleep1_struct sleep;
    sleep.nSleepTime   = nWaitTime;
    sleep.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); CWinThread * pThread = AfxBeginThread(Sleep1Thread, &sleep); //建立 Thread

    //WaitForSingleObject() 有讯号状态下, 会返回 WAIT_OBJECT_0, 无讯号则返回 WAIT_TIMEOUT
    while(WaitForSingleObject(sleep.hEvent, INFINITE) == WAIT_TIMEOUT)
    {
    //判断 UI 上是否有讯息需要处理
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }
    CloseHandle(sleep.hEvent);
    }
    方法二:利用循环一次休眠 100 毫秒,这方法也蛮笨的
    void CEventImporterUIDlg::Sleep2(unsigned long nWaitTime)
    {
    while(1)
    {
    //判断 UI 上是否有讯息需要处理
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    } //若 sleeptime 不足 100 豪秒, 则休眠 nWaitTime 后跳出
    if(nWaitTime<100)
    {
    if(nWaitTime!=0)
    Sleep(nWaitTime);
    break;
    } //每次休眠 100 毫秒
    Sleep(100);
    nWaitTime -= 100;
    }
    }
    方法三:利用程式暂用 CPU 时间,不过一直循环好像很浪费 CPU 资源
    void CEventImporterUIDlg::Sleep3(unsigned long nWaitTime)
    {
        unsigned long nStart = clock(); //clock() 会回传程式执行后占用的 CPU 时间, 精确度到毫秒
        unsigned long nEnd = nStart;
        do
    {
    if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
    {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
    }
            nEnd = clock();
        } while( ( nEnd - nStart )  <=  nWaitTime );
    }
      

  7.   

    你这种方法很好,我也有看到,我对多线程也不是很了解,我尝试采用第二种,第三种太占CPU。