上一篇多线程介绍的是,QT多线程处理机制,这篇,将对接收数据,实时处理进行分析。
QT通过socket通信,从接收缓冲区中读取数据,交给线程进行处理,那么问题来了,如果线程还没有处理完数据,则线程就没有办法继续从缓冲区中取数,那么当数据量过大的时候,缓冲区会满,继而被覆盖,从而造成数据的丢失。那么如何将数据存储在某个特定的空间内,并且让其他线程进行读取。这个是线程通信的问题,这个问题有多种方式,一种是操作系统课本上,通过线程同步、互斥、信号量这三种机制实现线程通信,或者就是通过循环队列的方式,完成线程通信。
这篇主要介绍的是第二种方式,即循环队列的方式,进行通信。
循环队列的实现方式,通过全局变量定义一个大的数组,同时,定义两个读写指针,这个指针不是语言中指针这个类型,可以理解成,两个标志位,记录读和写的位置,通过这种方式,可以实现一个循环队列的基本模型。如下图:
write表示写指针,read表示读指针。我们将从socket缓冲区接收到的数据,缓存到队列中,将写指针向后移动,另外一个线程,操作读指针,不断跟随写指针,将数据取出,处理。下面把代码贴上来供大家参考:
上面两段代码中,存在两个类,MyThreadRecv和MyThread,前者负责存储从socket中获取到的数据,后面这个类负责从队列中读取数据,并且处理。这样的机制,能够有效的处理循环队列中的数据,从而达到实时处理数据,并且保证数据准确性和实时性的问题,但是一个重点是,需要考虑什么时候队列满,什么时候队列空,这个问题是设计这个循环队列并且处理的关键,需要根据问题仔细的去分析,然后设计。
对于循环队列的基本内容,这里就不做详细的描述,因为比较简单,可以自行查找数据结构相关的内容。