3.1多线程的设计
线程的创建和销毁都需要分配、释放空间,对CPU的开销很大。若大量线程频繁的切换与释放,会成为该软件性能提升的瓶颈因素。故采用LabWindows/CVI中的线程池技术,对资源进行复用:在任务还未到来之前,创建一定线程,放入空闲队列中,这些线程起初处于睡眠状态,不消耗CPU,仅占用较小的内存空间,当请求到来后,缓冲池给该请求分配空闲线程,将请求传入此线程中进行处理。通过采用线程池,避免了频繁创建和销毁线程,从而提高系统性能。在该软件中,除主线程外,对每个串口设置一个线程,对USB采集卡设置一个采集线程、一个显示线程、一个存储线程。见图3。
图3线程池结构图
3.2主线程
主线程用于负责用户界面操作,初始化辅助线程,并负责辅助线程调度。初始状态时串口线程及USB线程处于睡眠状态,当任务到来时,根据任务类型唤醒相应线程来进行处理,完成任务后返回线程池。
3.3串口线程
配电设备状态信息采集系统中的测试资源包含2种RS485设备,常用的多串口通信方式通常有如下几种方式:采用单线程技术,通过设置定时器实现串口通信;对于所有串口设定一个读线程与一个写线程,其中,读线程从所有串口中读取数据,写线程将读取的数据写入缓存区,而主线程则用于负责管理子线程及显示数据、存储数据等功能;对每个串口设置一个线程,该线程负责每个串口的读取与写入,而主线程则用于管理子线程等。由于两个RS485设备的采集频率相差较大,若对两个串口同时设定一个读线程和一个写线程,这样就会增加高采集频率的采集设备的等待时间。故采用一个线程对应一个串口,这样每个串口的通信较为独立,效率高。
3.4USB采集卡多线程的设计
为了确保USB采集卡连续高速的采集,针对该采集卡创建一个采集线程来确保采集的实时性,这就导致在该采集线程中不能有任何窗口等图形操作,针对这种情况,再开辟一个子线程对其进行实时显示,而这个显示线程起初进入睡眠状态,是采集线程通过事件激活显示线程,使显示线程对采集的数据进行显示,为了将数据实时存储,采用同样的方式,开辟存储线程。
软件运行过程中,为了避免显示线程阻塞间接导致保存线程丢失数据,故采用二级缓冲区来避免这一情况的发生。当采集线程将一段大小的数据放入一块缓冲区后,除了继续采集外,还会改变缓冲区标志,告之显示线程可以将该缓冲区的数据进行处理与显示,当显示线程处理完数据后,发送消息给保存线程,然后再将下一次采集的数据放入第二块缓冲区,如此周而复始,这样不仅不会丢失数据,而且显示线程及保存线程有时间能处理缓冲区的数据。