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); }
不知道这样总结的对不对?
