我有一个 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掉呀?