Очередь сигналов между основным потоком и другим потоком в Qt

У меня есть следующие вещи:

  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");
}

Когда кнопка нажата, рабочий работает в течение 3 секунд. Если рабочий закончит работу, я могу перезапустить его, снова нажав кнопку. Но ничего не происходит, если нажать кнопку, когда рабочий все еще работает.

Можно ли поместить все сигналы нажатия кнопок в какую-то очередь, откуда поток может вытолкнуть их и начать работать?

Например: кнопка была нажата 4 раза быстро;
Worker запустился и закончился через 3 секунды,
Worker запустился и закончился через 3 секунды,
Worker запустился и закончился через 3 секунды,
Worker запустился и закончился через 3 секунды.

0 ответов

Другие вопросы по тегам