Qt 线程拒绝退出

Qt 线程拒绝退出,qt,Qt,资料来源: 我遇到QThread::currentThread()->quit()的问题 如果打开my myobject.cpp并转到第13行,则应该退出quit()调用。但是quit()调用似乎不起作用,它只是跳过了它。我看不出有什么问题( main.cpp: #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, arg

资料来源:

我遇到QThread::currentThread()->quit()的问题

如果打开my myobject.cpp并转到第13行,则应该退出quit()调用。但是quit()调用似乎不起作用,它只是跳过了它。我看不出有什么问题(

main.cpp:

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

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

    QObject::connect(&a, SIGNAL(aboutToQuit()),
                     &w, SLOT(cleanUp()));

    return a.exec();
}
#包括“mainwindow.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
QObject::连接(&a),信号(aboutToQuit()),
&w、 插槽(cleanUp());
返回a.exec();
}
mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myobject.h"
#include <QMessageBox>

MyObject* cObject;

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

    cThread = new QThread(this);
    cObject = new MyObject();
    cObject->moveToThread(cThread);

    QObject::connect(ui->pushButton_2, SIGNAL(clicked()),
                     this, SLOT(close()));

    QObject::connect(cThread, SIGNAL(started()),
                     cObject, SLOT(doWork()));

    QObject::connect(ui->pushButton, SIGNAL(clicked()),
                     this, SLOT(runThreadSlot()));

    QObject::connect(cThread, SIGNAL(finished()),
                     cThread, SLOT(deleteLater()));

    QObject::connect(cThread, SIGNAL(finished()),
                     cObject, SLOT(deleteLater()));

    QObject::connect(cObject, SIGNAL(setStatusBarSignal(QString)),
                     this, SLOT(setStatusBarSlot(QString)));

    ui->lineEdit->setValidator(new QIntValidator(this));
    ui->lineEdit->setFocus(Qt::OtherFocusReason);
    ui->statusBar->showMessage("Waiting for input...");
}

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

void MainWindow::runThreadSlot()
{
    cThread->start();
    // I've trimmed some code here.
}

void MainWindow::setStatusBarSlot(QString text)
{
    ui->statusBar->showMessage(text);
}

void MainWindow::cleanUp()
{
    qDebug() << "Cleaning up!";
    cObject->stage = 0;
    cThread->wait();
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括“myobject.h”
#包括
MyObject*cObject;
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
this->setFixedSize(this->size());
cThread=新的QThread(此);
cObject=新的MyObject();
cObject->moveToThread(cThread);
QObject::connect(用户界面->按钮2,信号(单击()),
这个,SLOT(close());
QObject::connect(cThread,SIGNAL(started()),
cObject,SLOT(doWork());
QObject::connect(用户界面->按钮,信号(单击()),
这个,SLOT(runThreadSlot());
QObject::connect(cThread,SIGNAL(finished()),
cThread,SLOT(deleteLater());
QObject::connect(cThread,SIGNAL(finished()),
cObject,SLOT(deleteLater());
QObject::connect(对象,信号(setStatusBarSignal(QString)),
这个,SLOT(setStatusBarSlot(QString));
ui->lineEdit->setValidator(新的QIntValidator(此));
ui->lineEdit->setFocus(Qt::OtherFocusReason);
用户界面->状态栏->显示消息(“等待输入…”);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::runThreadSlot()
{
cThread->start();
//我在这里删减了一些代码。
}
void主窗口::setStatusBarSlot(QString文本)
{
用户界面->状态栏->显示消息(文本);
}
void MainWindow::cleanUp()
{
qDebug()阶段=0;
cThread->wait();
}
myobject.cpp:

#include "myobject.h"
#include <QPixmap>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

MyObject::MyObject(QObject *parent) :
    QObject(parent)
{
}

void MyObject::doWork()
{
    QThread::currentThread()->quit(); // It doesn't stop here. This is my issue.
    // I've trimmed the code here.
}
#包括“myobject.h”
#包括
#包括
#包括
MyObject::MyObject(QObject*父对象):
QObject(父对象)
{
}
void MyObject::doWork()
{
QThread::currentThread()->quit();//它不会停在这里。这是我的问题。
//我已经在这里修改了代码。
}
mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void runThreadSlot();
    void setStatusBarSlot(QString);
    void cleanUp();

private:
    Ui::MainWindow *ui;
    QThread* cThread;
};

#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
专用插槽:
void runThreadSlot();
void setStatusBarSlot(QString);
空洞清理();
私人:
Ui::MainWindow*Ui;
QThread*cThread;
};
#endif//main窗口
myobject.h:

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QtCore>

class MyObject : public QObject
{
    Q_OBJECT
public:
    explicit MyObject(QObject *parent = 0);
    QFile path;
    qint32 waitSecs;
    int stage;

signals:
    void setStatusBarSignal(QString);

public slots:
    void doWork();

};

#endif // MYOBJECT_H
#如果我的对象
#定义MYOBJECT_H
#包括
类MyObject:公共QObject
{
Q_对象
公众:
显式MyObject(QObject*parent=0);
QFile路径;
32名服务员;
int阶段;
信号:
无效设置StatusBarSignal(QString);
公众时段:
无效销钉();
};
#endif//MYOBJECT\u H

QThread::quit()
是异步的。您应该添加
QThread::currentThread()->wait()
退出后立即发布。

您应该发布代码,而不是提供下载链接it@ashley:它需要文件来获取资源。你应该在这里发布代码的相关部分,或者更好。这里没有人会通过那个盲目链接从那个可疑的来源下载。也许我应该开始一个新项目,尝试回复回答此问题,然后重新发布此问题?是的,尝试隔离此问题并发布复制此问题的最小代码段正是您应该做的。编辑您的问题,以便在管理该问题后仅包含该最小测试用例。