使用线程时的GUI滞后问题

时间:2019-01-07 11:22:34

标签: c++ multithreading qt qt5 qthread

这是我现在使用的代码,问题是当我按下按钮时 线程正在启​​动,并且行编辑中的值正在更新。 但它会减慢GUI的整体速度。

我正在学习QThread,因此实现了此代码并面临困难。

  

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
 {
    ui->setupUi(this);
 } 

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

 void MainWindow::on_pushButton_clicked()
 {
  qDebug()<<"pd1";
  work->moveToThread(thread);

  connect(work,    SIGNAL(finished()), work,   SLOT(deleteLater()));
  connect(thread,  SIGNAL(started()),  work,   SLOT(process()));
  connect(work,    SIGNAL(datar(int)), this,   SLOT(display(int)));

  connect(work,    SIGNAL(finished()), thread, SLOT(quit()));
  connect(thread,  SIGNAL(finished()), thread, SLOT(deleteLater()));
  thread->start();
  qDebug()<<"pd2";
} 

 void MainWindow::display(int i)
{
  ui->lineEdit->setText(QString::number(i));
}

void MainWindow::on_pushButton_2_clicked()
{
   qDebug()<<"In push button - 2";
   for(int i = 0; i < 200; i++)
   {
      qDebug()<<i;
      ui->lineEdit_2->setText(QString::number(i));
   }
}
  

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <worker.h>
#include <QThread>


namespace Ui {
 class MainWindow;

}

class MainWindow : public QMainWindow
{
  Q_OBJECT

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

 public slots:
 void display(int i);

 private slots:
 void on_pushButton_clicked();

 void on_pushButton_2_clicked();

 void on_pushButton_3_clicked();

 void on_pushButton_4_clicked();

 private:
 Ui::MainWindow *ui;
 worker* work = new worker();
 QThread* thread = new QThread;

 };
  

worker.cpp

 #include "worker.h"
 #include <QDebug>

 worker::worker(QObject *parent) : QObject(parent)
 {

 }

 void worker::process()
{
   int index = 0;
   qDebug()<<"In here";
   while(true)
     {
        qDebug("Hello World!");
        index += 1;
        if(index > 10000)
        {
            index = 0;
        }
        emit datar(index);
    }
   emit finished();
 }
  

worker.h

 #ifndef WORKER_H
 #define WORKER_H

 #include <QObject>

 class worker : public QObject
{
   Q_OBJECT
 public:
  explicit worker(QObject *parent = 0);

 signals:
   void finished();
   void datar(int);

 public slots:
   void process();
 };

#endif // WORKER_H

我想要的是从线程连续地更新行编辑,这样就不会影响GUI性能。 如果您发现错误并建议我进行更改,那就太好了。

1 个答案:

答案 0 :(得分:1)

考虑您的worker::process实施...

void worker::process()
{
    int index = 0;
    qDebug()<<"In here";
    while(true)
    {
        qDebug("Hello World!");
        index += 1;
        if(index > 10000)
        {
            index = 0;
        }
        emit datar(index);
    }
    emit finished();
 }

它连续发出datar信号,并且没有任何中间延迟。但是信号发射器和接收器位于不同的线程上,这意味着信号将通过事件队列传递到接收器。因此,您基本上是在datar信号事件的作用下使GUI线程的事件循环饱和。

尝试在信号之间添加稍微延迟的信号,例如...

QThread::msleep(10);