Проблема с задержкой графического интерфейса при использовании потока - PullRequest
0 голосов
/ 07 января 2019

Это код, который я использую сейчас, проблема в том, когда я нажимаю на кнопку поток запускается, а значение в строке редактирования обновляется. но это в целом замедляет работу графического интерфейса.

Я изучаю 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

То, что я хотел, было обновить континуальную строку редактирования из потока так, чтобы это не влияло на производительность графического интерфейса. Было бы здорово, если бы вы выявили ошибку и предложили мне внести изменения.

1 Ответ

0 голосов
/ 07 января 2019

Рассмотрим вашу 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 непрерывно и без каких-либо задержек. Но излучатель и получатель сигнала находятся в разных потоках, что означает, что сигнал будет доставлен получателю через его очередь событий. Таким образом, вы в основном насыщаете цикл событий потока GUI событиями из сигнала datar.

Попробуйте поставить небольшую задержку между сигналами, например ...

QThread::msleep(10);
...