我有一个 work 任务类,准备要在
线程中跑的,现在是需要有三个 work 类,在三个单独的线程去跑,但是我发现每次的第一个线程会包括后面的任务,导致第1个线程跑了三次,第二个线程跑了2次,最后一个跑一次,这是怎么回事,代码如下:
work:
- #ifndef WORK_H
- #define WORK_H
- #include <QObject>
- class Work : public QObject
- {
- Q_OBJECT
- public:
- explicit Work(QObject *parent = nullptr);
- public slots:
- void startWork(QString id);
- signals:
- void sigWorkFinished(QString id);
- };
- #endif // WORK_H
- #include "work.h"
- #include <QThread>
- #include <QDebug>
- Work::Work(QObject *parent)
- : QObject{parent}
- {
- }
- void Work::startWork(QString id)
- {
- qDebug() << " Work::startWork:" << QThread::currentThread() << id << "Start ...";
- int i = 0;
- while (i < 5) {
- i++;
- QThread::sleep(1);
- }
- emit this->sigWorkFinished(id);
- }
MainWindow:
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- #include <QThread>
- #include <QMap>
- QT_BEGIN_NAMESPACE
- namespace Ui { class MainWindow; }
- QT_END_NAMESPACE
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- MainWindow(QWidget *parent = nullptr);
- ~MainWindow();
- private:
- Ui::MainWindow *ui;
- QMap<QString, QThread*> workMaps;
- signals:
- void sigStartWork(QString id);
- };
- #endif // MAINWINDOW_H
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include "work.h"
- #include <QThread>
- #include <QDebug>
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- , ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- workMaps.clear();
- int i=0;
- while (i<3) {
- QString id = QString::asprintf("pid-%1").arg(i);
- QThread *thread = new QThread();
- Work *work = new Work();
- work->moveToThread(thread);
- workMaps.insert(id, thread);
- qDebug() << "Main: insert" << id << "=>" << thread;
- connect(thread, &QThread::finished, work, &Work::deleteLater);
- connect(this, &MainWindow::sigStartWork, work, &Work::startWork);
- connect(work, &Work::sigWorkFinished, this, [=](QString id) {
- qDebug() << "Main: get work" << id << "finished.";
- QThread *thread = workMaps[id];
- if (thread) {
- thread->quit();
- thread->wait();
- }
- workMaps.remove(id);
- delete thread;
- });
- thread->start();
- emit this->sigStartWork(id);
- i++;
- }
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
跑完的结果如下:
- Main: insert "pid-0" => QThread(0x7f986ad08c90)
- Main: insert "pid-1" => QThread(0x7f986ad15ec0)
- Main: insert "pid-2" => QThread(0x7f986ad0d1a0)
- Work::startWork: QThread(0x7f986ad08c90) "pid-0" Start ...
- Work::startWork: QThread(0x7f986ad15ec0) "pid-1" Start ...
- Work::startWork: QThread(0x7f986ad0d1a0) "pid-2" Start ...
- Main: get work "pid-2" finished.
- Work::startWork: QThread(0x7f986ad08c90) "pid-1" Start ...
- Work::startWork: QThread(0x7f986ad15ec0) "pid-2" Start ...
- Main: get work "pid-0" finished.
- Work::startWork: QThread(0x7f986ad08c90) "pid-2" Start ...
- Main: get work "pid-1" finished.
- Main: get work "pid-1" finished.
- Main: get work "pid-2" finished.
- Main: get work "pid-2" finished.
可以很明显看到线程:
0x7f986ad08c90 跑了 pid-0, pid-1, pid-2
0x7f986ad15ec0 跑了 pid-1, pid-2
0x7f986ad0d1a0 跑了 pid-2
很困惑,如果我只要一个线程跑一个,怎么办???
另外,第二个
问题是有关 QThreadPool 的,我的任务类
继承 QRunnable,可以在里面加入flag来确定是否要退出线程,但是在 QThreadPool 里面还没开始运行(还在队列中排队的)那些,如果让它们停止或remove掉呀?