一个TCP/IP的程序,已经启动了两个线程不停的来接收与发送数据。在接受线程中,只是将接收的数据依次放到一个队列中,而主程序不停地从这个队列中取数据:
while(1)
{
    //从队列中取数据
}上面的方法确是能够取到数据,但是却会导致CPU的占用率为100%。后来在while循环中加上了sleep(1),能够解决这个问题,但总觉得这个方法不是一个好的方法,请问是否还有更好的方法?谢谢!

解决方案 »

  1.   

    1.数据接收线程 PostThreadMessage
    2.主线程 ON_THREAD_MESSAGE( message, memberFxn )
       主线程在memberFxn函数中读取队列数据
      

  2.   

    首先说楼主的方法是可以的,甚至可以让sleep更时间长一些都可以,因为队列LZ正在维护,不会出现问题。这样CPU会占的更低。另外,一般对于数据接收都是在接收到数据时才触发其它的事件,所以在接收数据函数中将接收到的数据拷贝至新MEM,然后启动新线程处理此数据,个人觉得这样可能会更好点。
      

  3.   

    使用信号量做,
    当队列为空时调用ResetEvent,
    收到数据SetEvent
      

  4.   

    改成sleep(0);切换一下cpu使用权就可以了吧,不用费时
    不停的接收和发送的的话
    用event的话
    就是控制收到一定量后setevent
      

  5.   

    楼主的处理没有问题
    用两个子线程分别接收、处理。处理子线程,去读数据,读到就处理,处理完再sleep,读不到也sleep,只要能来得及处理就行了。
      

  6.   

    设置一个timer,主线程在timer里面处理就行了,关键是计算好数据接收的时间..................
      

  7.   

    另外一个方法也可以使用Event来处理,或者用消息也可以。
    如接收了数据后设置event,或者发消息给主线程............
      

  8.   

    Sleep 方法不建议用。CPU就是用来工作的,你让他Sleep干嘛 。主线程中。
    While(1)
    {
       WaitForSingleObject(hEvent);
       ... ...
    }接收线程中。
    接收到数据后。SetEvent(hEvent);这样就OK了。
      

  9.   

    没必要Sleep,只要你同步和互斥做得OK就行了
      

  10.   

    sleep 是对的,没有什么不好。
      

  11.   

    如果不要求实时的话,建议用timer,我在工程中就是这么做的,timer一到,我到队列中读取数据,感觉挺好用的另外sleep我不觉得有什么问题,使用信号量我觉得效率上不见得比sleep更好。