Очередь сигналов между основным потоком и другим потоком в Qt
У меня есть следующие вещи:
- интерфейс приложения с одной кнопкой;
- класс с именем 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 секунды.