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); }
不知道这样总结的对不对?
浙公网安备 33010602011771号