代码改变世界

Qt Thread and Worker

2025-12-07 20:43  @学无止境  阅读(2)  评论(0)    收藏  举报
#ifndef QUEUETHREAD_H
#define QUEUETHREAD_H

#include <QDebug>
#include <QMutex>
#include <QObject>
#include <QQueue>
#include <QThread>

class QueueThread : public QThread {
    Q_OBJECT
  public:
    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_OBJECT
  public:
    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);
}

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