C++ 即使使用QThread,QT程序也会暂停

C++ 即使使用QThread,QT程序也会暂停,c++,qt,qthread,qtgui,C++,Qt,Qthread,Qtgui,我有一个程序,旨在找到一定数量的赔率/偶数。我跟踪这一点,并从一个工作线程显示在我的GUI中。这是可行的,但当它工作时,程序会冻结。程序仍在计算,但它停止更新GUI。这是我的相关代码: MainWindow.h: \ifndef主窗口 #定义主窗口 #包括 #包括 类计数器线程:公共QThread { Q_对象 公众: 反螺纹(); 无效运行(); 信号: void setProgress(int值); void setOdd0(int值); void setOdd1(int值); void s

我有一个程序,旨在找到一定数量的赔率/偶数。我跟踪这一点,并从一个工作线程显示在我的GUI中。这是可行的,但当它工作时,程序会冻结。程序仍在计算,但它停止更新GUI。这是我的相关代码:

MainWindow.h:
\ifndef主窗口
#定义主窗口
#包括
#包括
类计数器线程:公共QThread
{
Q_对象
公众:
反螺纹();
无效运行();
信号:
void setProgress(int值);
void setOdd0(int值);
void setOdd1(int值);
void setOdd2(int值);
void setOdd3(int值);
void setOdd4(int值);
无效设置ODD5(整数值);
void setOdd6(int值);
};
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
专用插槽:
单击按钮时无效();
私人:
Ui::MainWindow*Ui;
反螺纹*cThread;
};
#endif//main窗口
MainWindow.cpp:
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
cThread=新的反螺纹();
连接(cThread,信号(setOdd0(int)),ui->lcdNumberodd0,插槽(display(int));
连接(cThread,信号(setOdd1(int)),ui->lcdNumberodd0,插槽(display(int));
连接(cThread,信号(setOdd2(int)),ui->lcdNumberodd0,插槽(display(int));
连接(cThread,SIGNAL(setOdd3(int)),ui->lcdNumberodd0,SLOT(display(int));
连接(cThread,信号(setOdd4(int)),ui->lcdNumberodd0,插槽(display(int));
连接(cThread,SIGNAL(setOdd5(int)),ui->lcdNumberodd0,SLOT(display(int));
连接(cThread,SIGNAL(setOdd6(int)),ui->lcdNumberodd0,SLOT(display(int));
连接(cThread,SIGNAL(setProgress(int)),ui->progressBar,SLOT(setValue(int));
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在按钮上单击()
{
ui->progressBar->setMaximum(13983816);
cThread->start();
ui->progressBar->setValue(ui->progressBar->maximum());
}
CounterThread::CounterThread()
{
}
void CounterThread::run()
{
int odd0=0;
int odd1=0;
int-odd2=0;
int-odd3=0;
int-odd4=0;
int-odd5=0;
int-odd6=0;
用于(int x=99999;x<999999;x++)
{
整数=0;
对于(int i=0;i
工作线程的run()函数修改主线程拥有的对象(例如UI线程)。对setProgress()的多次调用将快速填充GUI上的事件队列,并导致其他事件无法响应

有关Stackoverflow的其他内容讨论了在Qt中设置工作线程的正确方法,例如:

(QString(QString::number(x)[i]).toInt()%2!=0)
请仔细考虑这一部分。您的代码没有
main()
,因此链接失败,我们无法重现您描述的症状。请学习如何创建,然后将您的问题添加到缺少的代码中。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QThread>

class CounterThread : public QThread
{
    Q_OBJECT
public:
    CounterThread();
    void run();
signals:
    void setProgress(int value);
    void setOdd0(int value);
    void setOdd1(int value);
    void setOdd2(int value);
    void setOdd3(int value);
    void setOdd4(int value);
    void setOdd5(int value);
    void setOdd6(int value);
};

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    CounterThread *cThread;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qDebug>
#include <QLCDNumber>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    cThread = new CounterThread();
    connect(cThread, SIGNAL(setOdd0(int)), ui->lcdNumberodd0, SLOT(display(int)));
    connect(cThread, SIGNAL(setOdd1(int)), ui->lcdNumberodd0, SLOT(display(int)));
    connect(cThread, SIGNAL(setOdd2(int)), ui->lcdNumberodd0, SLOT(display(int)));
    connect(cThread, SIGNAL(setOdd3(int)), ui->lcdNumberodd0, SLOT(display(int)));
    connect(cThread, SIGNAL(setOdd4(int)), ui->lcdNumberodd0, SLOT(display(int)));
    connect(cThread, SIGNAL(setOdd5(int)), ui->lcdNumberodd0, SLOT(display(int)));
    connect(cThread, SIGNAL(setOdd6(int)), ui->lcdNumberodd0, SLOT(display(int)));
    connect(cThread, SIGNAL(setProgress(int)), ui->progressBar, SLOT(setValue(int)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    ui->progressBar->setMaximum(13983816);
    cThread->start();
    ui->progressBar->setValue(ui->progressBar->maximum());
}


CounterThread::CounterThread()
{

}

void CounterThread::run()
{
    int odd0 = 0;
    int odd1 = 0;
    int odd2 = 0;
    int odd3 = 0;
    int odd4 = 0;
    int odd5 = 0;
    int odd6 = 0;
    for (int x = 99999; x < 999999; x++)
    {

        int oddNumbers = 0;
        for(int i = 0; i < QString::number(x).length(); i++)
        {
            if (QString(QString::number(x)[i]).toInt() % 2 != 0)
                oddNumbers++;
        }
        setProgress(x);
        switch (oddNumbers)
        {
        case 0:
            odd0++;
            setOdd0(odd0);
            break;
        case 1:
            odd1++;
            setOdd1(odd1);
            break;
        case 2:
            odd2++;
            setOdd2(odd2);
            break;
        case 3:
            odd3++;
            setOdd3(odd3);
            break;
        case 4:
            odd4++;
            setOdd4(odd4);
            break;
        case 5:
            odd5++;
            setOdd5(odd5);
            break;
        case 6:
            odd6++;
            setOdd6(odd6);
            break;
        }
    }
}