Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我再次尝试启动同一线程时,为什么应用程序会崩溃?_C++_Qt_Qt5 - Fatal编程技术网

C++ 当我再次尝试启动同一线程时,为什么应用程序会崩溃?

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

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(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())
                 );