两个模块间需要传输数据,模块A将数据发送给模块B,每秒可能有上百个数据,每个100左右个字节。目前想到以下的方式:
1.A将数据压入一个队列,B开启一个线程,该线程使用死循环从队列弹出数据。这样的话有一个问题,如果循环中不加Sleep(1),就会导致CPU占用率过高,加了Sleep的话,取数据的速度可能比较慢,跟不上压数据的速度,可能造成数据丢失。当然也可以在每次Sleep之间连续取出多个数据并处理。
2.A模块获得B中用于接收数据的的线程ID,使用PostThreadMessage函数向该线程发送消息同时将数据或者其地址作为参数发送。B使用死循环调用GetMessage接收,因为GetMessage本身会阻塞,并不需要加Sleep,效率会比方法一有所提高。前提就是A必须获得B中接收线程的ID。请教一下,哪个方法好?方法2作为模块间数据交互的方式,是否合适?有什么弊端?

解决方案 »

  1.   

    我才搞过类似的东西,两个线程间通信,每秒200多帧数据,每帧14字节
    我的做法是设个全局句柄,用事件通信(SetEvent)
    数据用链表,当然用STL也可以
    A、B都有一个链表指针
    A有数据要发送时,就向右添加链表单元,指针右移,并SetEvent
    B等待事件(WaitForSingleObject),等到则循环读取链表内容,直到链表尾,跳出循环继续等待事件
      

  2.   

    用队列,A压数据,B取数据,互斥一下。
    如果队列空了,B就挂起,
    A压数据时,发现B挂起,就唤醒B.当然,如果队列上溢,那就是另外一个问题了。
      

  3.   

    这明显是一个“生产者和消费者”的问题(看一下任何一本操作系统原理的书,上面都有详细的介绍)。
    使用互斥量就可以解决了,使用Event和WaitForSingleObject就可以解决了。