是主线程停止响应吗?
Sleep(1)也无关紧要啊

解决方案 »

  1.   

    我觉得你给的信息太少了,不足以看出问题所在。不过,sleep()函数对于小于50的调用是非常不准确的,这是和系统的定时机制有关。但sleep()还有另外一个作用是使调用sleep()的线程释放对cpu的控制权,导致线程间的切换。请给出进一步的描述。
      

  2.   

    我是用AfxBeginThread()开的线程,优先级是默认的NORMAL级,五个线程函数几乎一样
    下面的是第一个线程:
    UINT MyThread1(LPVOID pParam)
    {
        volatile int i,j;
        for (i=0;i<=3000;i++)
        {
            for (j=0;j<=2;j++)
            {
                Sleep(1)//不加就不行,不知为什么?
            }
        ::SendMessage((HWND)pParam,WM_MYMESSAGE,1,i);//1表示第一个线程
        }
    }
    第二个线程发出::SendMessage((HWND)pParam,WMMYMESSAGE,2,i);//2 表示第二个线程
    ...
    WM_MYMESSAGE主要用于处理界面上的五个静态文本的更新
      

  3.   

    你的::SendMessage((HWND)pParam,WM_MYMESSAGE,1,i);用法可能有问题,
    它是必须在你的对话框处理后才能返回.
    这样你的线程都实际堵塞在对话框主线程中了.加入Sleep()就顺序执行了.
      

  4.   

        for (i=0;i<=3000;i++)
        {
            for (j=0;j<=2;j++)
            {
                Sleep(1)//不加就不行,不知为什么?
            }
        }
    可能CPU占用率太高,
    必须强迫释放
      

  5.   

    同意wzq,SendMessage必须等待消息处理完才返回,建议换成PostMessage试试,另外,你的主线程在处理消息时要注意代码重入问题,尽量避免使用全局变量。
      

  6.   

    同意wzq和Lin 的观点。
    但有一点,wzq说“加入Sleep()就顺序执行了”,好象不妥。操作系统对CPU资源的调度有着自己的算法,执行顺序是完全用户无法干预和预测的,不管你使用SendMessage()还是PostMessage().
    如果你希望这几个线程按照固定的顺序被主线程处理,你可以考虑使用互斥量.
      

  7.   

    十在对不起大家,上面的代码有误,PostMessage写成SendMessage了,我反复实验,结论如下:
    用PostMessage()就一定要加Sleep(1);
    用SendMessage()不加Sleep(1)也行。
    我想了一下,可能是用PostMessage五个线程会一下发出很多消息,主线程来及处理,就停止响应了。
      

  8.   

    我也这样认为,用PostMessage()五个线程会一下发出很多消息,主线程来不及处理,但不会停止响应,只是很“忙”。
    而SendMessage()线程要等待主线程的返回,消息发送速度比PostMessage()慢.
      

  9.   

    循环占用cpu过多,必需用sleep(1)释放,我猜你做的循环是用来延时的,那为什么不用消息或者wait类函数呢?
      

  10.   

    同意jamesw,fbq,forgettor等人的观点