Qt 线程拒绝退出
资料来源: 我遇到QThread::currentThread()->quit()的问题 如果打开my myobject.cpp并转到第13行,则应该退出quit()调用。但是quit()调用似乎不起作用,它只是跳过了它。我看不出有什么问题( main.cpp: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
#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:它需要文件来获取资源。你应该在这里发布代码的相关部分,或者更好。这里没有人会通过那个盲目链接从那个可疑的来源下载。也许我应该开始一个新项目,尝试回复回答此问题,然后重新发布此问题?是的,尝试隔离此问题并发布复制此问题的最小代码段正是您应该做的。编辑您的问题,以便在管理该问题后仅包含该最小测试用例。