当前位置: 首页 > news >正文

Qt Thread and Worker

Qt Thread and Worker

2025-12-07 20:43  @学无止境  阅读(0)  评论(0)    收藏  举报
#ifndef QUEUETHREAD_H
#define QUEUETHREAD_H#include <QDebug>
#include <QMutex>
#include <QObject>
#include <QQueue>
#include <QThread>class QueueThread : public QThread {Q_OBJECTpublic:QueueThread();private:QMutex m_mutex;QQueue<int> m_queue;protected:void run();public:void appendData(int data);public slots:void slot_receiveData(int data);
};#endif  // QUEUETHREAD_H
#include "queuethread.h"QueueThread::QueueThread() {//  工作在主线程qDebug() << QThread::currentThreadId() << " " << __func__ << endl;
}void QueueThread::run() {while (true) {QMutexLocker locker(&m_mutex);//  工作在子线程if (!m_queue.isEmpty()) {int head = m_queue.dequeue();qDebug() << QThread::currentThreadId() << " " << __func__ << " " << head << endl;}}
}void QueueThread::appendData(int data) {QMutexLocker locker(&m_mutex);//  工作在主线程qDebug() << QThread::currentThreadId() << " " << __func__ << endl;m_queue.enqueue(data);
}void QueueThread::slot_receiveData(int data) {QMutexLocker locker(&m_mutex);//  工作在主线程qDebug() << QThread::currentThreadId() << " " << __func__ << endl;m_queue.enqueue(data);
}

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef QUEUEWORKER_H
#define QUEUEWORKER_H#include <QDebug>
#include <QMutex>
#include <QObject>
#include <QQueue>
#include <QThread>class QueueWorker : public QObject {Q_OBJECTpublic:explicit QueueWorker(QObject* parent = nullptr);private:QMutex m_mutex;QQueue<int> m_queue;public:void appendData(int data);signals:public slots:void doWork();void slot_doWork(int data);
};#endif  // QUEUEWORKER_H
#include "queueworker.h"QueueWorker::QueueWorker(QObject* parent): QObject(parent) {//  工作在主线程qDebug() << QThread::currentThreadId() << " FFF " << __func__ << endl;
}void QueueWorker::appendData(int data) {QMutexLocker locker(&m_mutex);// 工作在主线程qDebug() << QThread::currentThreadId() << " FFF " << __func__ << endl;m_queue.enqueue(data);
}void QueueWorker::doWork() {QMutexLocker locker(&m_mutex);// 工作在子线程if (!m_queue.isEmpty()) {int head = m_queue.dequeue();qDebug() << QThread::currentThreadId() << " FFF " << __func__ << " " << head << endl;}
}void QueueWorker::slot_doWork(int data) {// 工作在子线程qDebug() << QThread::currentThreadId() << " FFF " << __func__ << " " << data << endl;
}

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

m_queueThread2 = new QueueThread;connect(this, &MainWindow::sig_sendData, m_queueThread2, &QueueThread::slot_receiveData);m_queueThread2->start();m_queueThread = new QThread;m_queueWorker = new QueueWorker;m_queueWorker->moveToThread(m_queueThread);connect(this, &MainWindow::sig_doWork, m_queueWorker, &QueueWorker::doWork);connect(this, &MainWindow::sig_doWork2, m_queueWorker, &QueueWorker::slot_doWork);m_queueThread->start();m_timer = new QTimer;// connect(m_timer, SIGNAL(timeout()), this, SLOT(on_Timer()));// m_timer->start(100);

connect(m_timer, SIGNAL(timeout()), this, SLOT(on_Timer2()));m_timer->start(100);

void MainWindow::on_Timer() {static int i = 0;i++;/// method 1// m_queueWorker->appendData(i);// emit sig_doWork();/// method 2
    emit sig_doWork2(i);
}void MainWindow::on_Timer2() {static int i = 0;i++;/// method 1// m_queueThread2->appendData(i);/// method 2
    emit sig_sendData(i);
}

不知道这样总结的对不对?