簡體   English   中英

多線程在QT中不起作用

[英]Multi-thread not working in QT

我正在使用GUI在QT中開發C ++應用程序。 為了使GUI始終響應,我為其他阻止進程創建了一個線程。 但是,該應用程序正在等待阻止過程,因此GUI沒有響應。 創建用於阻塞進程的線程是錯誤的方法嗎? 還是在QT中不起作用? 如果是這樣,如何使GUI響應? 請舉個例子。

這是帶有響應式GUI的多線程應用程序的簡單示例:

main.cpp中

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>
#include <QThread>

class Worker : public QThread
{
protected:
    /// Wait 3s which simulates time demanding job.
    void run() { sleep(3); }
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);

public slots:
    void doJob(bool);
    void jobFinished();

private:
    Worker worker;
    QLineEdit *line;
    QPushButton *button;
    int counter;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QVBoxLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
      line(new QLineEdit()),
      button(new QPushButton()),
      counter(0)
{
    line->setDisabled(true);
    line->setAlignment(Qt::AlignRight);
    line->setText(QString::number(counter));
    button->setText("Push");

    connect(button, SIGNAL(clicked(bool)), this, SLOT(doJob(bool)));
    connect(&worker, SIGNAL(finished()), this, SLOT(jobFinished()));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(line);
    layout->addWidget(button);
    QWidget *window = new QWidget();
    window->setLayout(layout);
    setCentralWidget(window);
}    

void MainWindow::doJob(bool)
{
    // Only one thread is running at a time.
    // If you want a thread pool, the implementation is up to you :)
    worker.start();

    // Uncomment to wait. If waiting, GUI is not responsive.
    //worker.wait();
}

void MainWindow::jobFinished()
{
    ++counter;
    line->setText(QString::number(counter));
}

Qt具有很好的多線程支持。 您可能做錯了什么,如果您不提供任何代碼,我們將無法為您提供幫助。 有很多方法可以實現“響應式” GUI! (包括很多方法如何實現另一個線程!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM