char buf[4096];
m_Socketcp.receve(buf,4096,pMgr->m_Socketcp.CLINET_SOCK[0]);
接收到后存放在buf中的数据未传给处理线程,就又收到了新的消息,将上一消息覆盖

解决方案 »

  1.   

    楼主担心会出现什么呢?
    应该考虑线程互斥问题,就可以了,两个线程不能同时对buf读写操作
      

  2.   

    我个人觉得应该采用事件等待的机制,比如waitforsingleobject()
      

  3.   

    我现在用的是CSocket::OnReceive()
    出现了我刚才说的问题,有些数据接收了处理不了
    我想过用缓冲,但对于包的解析不知道怎么做?
    你有相关的例子吗?
      

  4.   

    会出现,一般是在发送线程时做个Sleep()
      

  5.   

    我想过用缓冲,但对于包的解析不知道怎么做?=========================================
    为什么解析,你收到的不就是数据吗?建议多缓冲,两个buf,一个满了马上处理,顺便用事件通知程序填充第二个buf。
    如果你只是简单的处理建议不要这么做,麻烦。队列的话,可以收到一个包,不要处理,放入队列,随后又去继续接受包,用另外一个线程来专门处理队列,类似于驱动的延时过程调用DPC方式。
      

  6.   

    要是用Sleep()不是太好吧
    配置不同添写的时间就不同
    添大了影响效率
      

  7.   

    这样的数据没必要用CQueue类
    你只有一种数据类型,而且是已知的,我认为自己写个CQueue类效率要
    比MS的CQueue类效率高很多,
    我的想法是
    用循环队列来实现,有X个数据包的缓冲的大小,接收/发送方用到数据时会将队列的那个节点加锁,以现实互斥.
      

  8.   

    延时过程调用DPC不是延时,它是将数据的处理放在另外的地方,不干扰当前的线程,是一种编程思想。
      

  9.   

    jzyhummel(篱影) 
    你说的当然没有错,但是我宁愿多个线程去竞争一个简单的连接队列,而不是去竞争一堆BUFFER的队列。
      

  10.   

    zhanvi(追梦) 
    挺简单的啊,一个共享互斥缓冲队列,一个线程接受数据并存入,另外一个线程读出数据并处理
    ========================================================================
    这样有一个问题:
    你建立一个共享的互斥缓冲队列,一个线程接收数据并存入,另外一个线程读出数据并处理。
    这么一来,你就必须锁定共享资源:互斥的缓冲队列,你锁定时如果锁定单个待操作的的队列节点,显然是不行的,你必须锁定整个共享的户出缓冲队列,这样带来的系统开销是不是太大了哪?