这篇的代码主体是参考http://blog.csdn.net/hackooo/article/details/8794428
但是原文只用了主线程加上一个子线程,而我设计所需架构需要4个子线程,并且是基于QT框架下的,所以结合QT多线程同步的知识,对之前的程序进行了改编。
补充一些QT多线程的小知识。
QThread 创建子线程,通过重写QThread::run()函数,加入自己所需功能,利用QThread的对象调用start,开始执行
QMutex 互斥锁,用于线程同步,主要需要用lock与unlock两个上锁解锁功能
QWaitCondition 等待条件量,
——QWaitCondition::wait(&Mutex) 等待Mutex释放,被唤醒,若锁,则堵塞等待
——QWaitCondition::wakeOne() 唤醒其他的一个等待线程
——QWaitCondition::wakeAll() 唤醒所有等待线程
struct stage_tag {
QMutex mutex; /*保护数据*/
QWaitCondition has_data; /*当前流水节点处于空闲可用状态, 等待接收数据,进行加工*/
QWaitCondition has_done; /*当前处于数据准备状态,写入当前节点,*/
bool work_data=0; /*节点数据状态, 1 有数据,可执行 0 表示没有数据*/
bool work_done=1; /*节点数据状态, 1 处理完,等新数据 0 表示没处理完*/
long data;
} stage1,stage2,stage3,stage4;
int i = 3; //循环3次
/**
工人干活的线程,基本循环:
1.等待前干些准备工作;
2.等待输入
3.处理输入;
4.发送信号,解锁
*/
void thread1::run() {
//等待2信号后采集
while (i) {
stage2.mutex.lock();
//处理数据(因为是首站,所以这里先处理,拿数据)
while (!stage2.work_done) {//若工人2未完成,则等待
emit getdata("tread1 waiting...");//qt界面显示,此处用的信号槽机制
stage2.has_done.wait(&stage2