0

主.cpp:

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

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

    return a.exec();
}

主窗口.cpp:

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

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

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

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

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

    QObject::connect(ui->pushButton_4, 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))
                     );
}

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

void MainWindow::runThreadSlot()
{
    cThread->start();
}

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

我的对象.cpp:

#include "myobject.h"

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

void MyObject::doWork()
{
    emit setStatusBarSignal(QString::number((qint32) QThread::currentThreadId()));
    QThread::currentThread()->quit();
    return;
}

主窗口.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

我的对象.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

所以模式是:

pushButton_4 clicked() ---> runThreadSlot() ---> cThread start()

线程立即用 杀死自己QThread::currentThread()->quit();,但是当我再次单击 pushButton_4 时,应用程序崩溃了。

4

1 回答 1

1

这很可能是您的问题。

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

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

想想完成信号发出后会发生什么。

于 2013-04-27T01:18:04.450 回答