QT C ++ предотвращает Runtime Error при закрытии приложения - PullRequest
0 голосов
/ 11 сентября 2018

Я пишу приложение QT, и все в порядке со сборкой и работой, но когда я закрываю приложение с запущенным потоком, приложение закрывается и показывает сообщение: [Ошибка выполнения ....].

Вывод приложения говорит:

QThread: Destroyed while thread is still running
The program has unexpectedly finished.
The process was ended forcefully.
example crashed.

как это решить?

Пример:

main.cpp

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

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

    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    example = new Thread(this);
    connect(example, SIGNAL(print_line(QString)), this, SLOT(print_line2(QString)), Qt::BlockingQueuedConnection);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::print_line2(QString in)
{
    ui->textBrowser->append(in);
}

void MainWindow::on_pushButton_clicked()
{
    example->start();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <Thread.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

public slots:
    void print_line2(QString in);

private slots:

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

Thread.cpp

#include "Thread.h"
#include <windows.h>

using namespace std;

Thread::Thread(QObject *parent):
    QThread(parent)
{

}

Thread::~QThread()
{
    delete ui;
}

void Thread::print(QString in)
{
    print_line(in);
}

void Thread::run()
{
    int count = 0;
    for(;;) {
        Sleep(100);
        count += 1;
        print(QString::number(count));
    }
}

Thread.h

#ifndef READINFO_H
#define READINFO_H
#include <QThread>

class Thread : public QThread
{
    Q_OBJECT

public:
   explicit Thread(QObject *parent =0);
   void print(QString in);
   void run();

signals:

   void print_line(QString x);

};

#endif

Готовый пример

1 Ответ

0 голосов
/ 12 сентября 2018

Проблема в том, что поток все еще находится в рабочем состоянии, когда ваше приложение закрывается.

Код внутри Thread :: Run () содержит бесконечный цикл - он не может завершиться сам. Вам нужно написать свой поток так, чтобы он завершился, или, по крайней мере, вам нужно принудительно прекратить поток до закрытия приложения.

Для принудительного завершения вы можете добавить две строки кода в деструктор MainWindow следующим образом:

MainWindow::~MainWindow() 
{ 
    example->terminate(); 
    example->wait(); 
    (...)
}
...