多线程在QT中不工作 我在QT中用GUI开发C++应用程序。为了使GUI始终响应,我为其他阻塞过程创建了一个线程。但是,应用程序正在等待阻塞过程,因此GUI没有响应。 为阻塞进程创建线程是一种错误的方法吗? 或者它在QT中不起作用?如果是,如何使GUI响应?请给我举个例子。

多线程在QT中不工作 我在QT中用GUI开发C++应用程序。为了使GUI始终响应,我为其他阻塞过程创建了一个线程。但是,应用程序正在等待阻塞过程,因此GUI没有响应。 为阻塞进程创建线程是一种错误的方法吗? 或者它在QT中不起作用?如果是,如何使GUI响应?请给我举个例子。,c++,qt,C++,Qt,这是一个带有响应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” #包括 int main(int ar

这是一个带有响应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”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
返回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
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括
类辅助程序:公共QThread
{
受保护的:
///等待3s,模拟耗时的工作。
void run(){sleep(3);}
};
类主窗口:公共QMainWindow
{
Q_对象
公众:
主窗口(QWidget*父窗口=0);
公众时段:
无效作业(bool);
void jobFinished();
私人:
工人;
QLineEdit*行;
QPushButton*按钮;
整数计数器;
};
#endif//main窗口
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));
}
#包括“mainwindow.h”
#包括
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级),
行(新的QLineEdit()),
按钮(新的QPushButton()),
计数器(0)
{
行->设置禁用(真);
line->setAlignment(Qt::AlignRight);
行->设置文本(QString::number(计数器));
按钮->设置文本(“按下”);
连接(按钮、信号(点击(bool))、此、插槽(doJob(bool));
连接(&worker,信号(finished()),此,插槽(jobFinished());
QVBoxLayout*布局=新的QVBoxLayout;
布局->添加小部件(行);
布局->添加小部件(按钮);
QWidget*窗口=新的QWidget();
窗口->设置布局(布局);
setCentralWidget(窗口);
}    
void主窗口::doJob(bool)
{
//一次只运行一个线程。
//如果您想要一个线程池,具体实现取决于您:)
worker.start();
//取消对等待的注释。如果等待,GUI没有响应。
//worker.wait();
}
void主窗口::jobFinished()
{
++计数器;
行->设置文本(QString::number(计数器));
}

Qt具有非常好的多线程支持。您可能做错了什么,如果您不提供任何代码,我们将无法帮助您。有很多方法可以实现“响应式”GUI!(包括许多实现另一个线程的方法!)

你能说得更具体一点吗?你能给我们一个复制程序的最小示例代码吗?或者你能用一些示例代码解释一下阻塞操作实际上是什么吗?确实可以用Qt实现它。我正在开发一个应用程序,我们已经成功地实现了“始终响应”GUI。你可以通过下面的链接,你会得到一些关于如何做的想法。Qt有一个非常好的多线程支持,我真的觉得你做错了什么。