C++ 当我再次尝试启动同一线程时,为什么应用程序会崩溃?
main.cpp:C++ 当我再次尝试启动同一线程时,为什么应用程序会崩溃?,c++,qt,qt5,C++,Qt,Qt5,main.cpp: #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } myobject.cpp: #include "myobject.h" MyObject::MyObject(QObje
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
myobject.cpp:
#include "myobject.h"
MyObject::MyObject(QObject *parent) :
QObject(parent)
{
}
void MyObject::doWork()
{
emit setStatusBarSignal(QString::number((qint32) QThread::currentThreadId()));
QThread::currentThread()->quit();
return;
}
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "myobject.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void runThreadSlot();
void setStatusBarSlot(QString);
private:
Ui::MainWindow *ui;
QThread* cThread;
MyObject* cObject;
};
#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
#包括“myobject.h”
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
专用插槽:
void runThreadSlot();
void setStatusBarSlot(QString);
私人:
Ui::MainWindow*Ui;
QThread*cThread;
MyObject*cObject;
};
#endif//main窗口
myobject.h:
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include <QtCore>
class MyObject : public QObject
{
Q_OBJECT
public:
explicit MyObject(QObject *parent = 0);
signals:
void setStatusBarSignal(QString);
public slots:
void doWork();
};
#endif // MYOBJECT_H
#如果我的对象
#定义MYOBJECT_H
#包括
类MyObject:公共QObject
{
Q_对象
公众:
显式MyObject(QObject*parent=0);
信号:
无效设置StatusBarSignal(QString);
公众时段:
无效销钉();
};
#endif//MYOBJECT\u H
因此,模式是:
按钮_4单击()-->runThreadSlot()-->cThread start()
线程立即通过
QThread::currentThread()->quit()自杀代码>,但当我再次单击按钮_4时,应用程序崩溃。这很可能是您的问题
QObject::connect(cThread, SIGNAL(finished()),
cThread, SLOT(deleteLater())
);
QObject::connect(cThread, SIGNAL(finished()),
cObject, SLOT(deleteLater())
);
想想发出完成的信号后会发生什么。Oh。接得好。为什么第二个是多余的?哦,对不起。我的错。我刚刚注意到一个连接到cThread,另一个连接到cObject。
QObject::connect(cThread, SIGNAL(finished()),
cThread, SLOT(deleteLater())
);
QObject::connect(cThread, SIGNAL(finished()),
cObject, SLOT(deleteLater())
);