主线程与Qt中另一个线程之间的信号队列

时间:2020-05-22 16:21:30

标签: multithreading qt5 qthread qt-signals queued-connection

我有以下事情:

  1. 带有一个按钮的应用程序界面;
  2. 一个名为Worker的类,它可以完成一些工作(通过qDebug()编写一个字符串)。

应用程序启动时,Worker移至另一个线程。单击的按钮的信号连接到线程的插槽,如下所示:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    thread = new QThread(this);
    worker = new Worker();
    worker->moveToThread(thread);
    worker->information = "hello world";

    connect(this, &QMainWindow::destroyed, thread, &QThread::terminate);
    connect(ui->b_b1, SIGNAL(clicked()), thread, SLOT(start()));
    connect(thread, &QThread::started, worker, &Worker::doWork);
    connect(worker, &Worker::resultReady, thread, &QThread::quit);
}

Worker::Worker(QObject *parent)
:QObject (parent)
{
    information = "default";
}

void Worker::doWork()
{
    for (int i = 0; i < 3; i++){
        Sleep(1000);
        qDebug() << "i= " << i << " " << information;
    }
    emit resultReady("done");
}

单击按钮时,Worker确实工作了3秒钟。如果工作者完成工作,可以再次单击该按钮以重新启动。但是,如果在Worker仍在工作时单击按钮,则不会发生任何事情。

是否可以将所有按钮单击信号按某种顺序从线程可以弹出并开始工作的队列中发送?

例如: 该按钮已被快速单击4次;
工人开始,并在3秒后完成,
工人开始,并在3秒后完成,
工人开始,并在3秒后完成,
工作人员开始,并在3秒后完成。

0 个答案:

没有答案