(Qt5,主题)我以后的例子都没有用

时间:2014-11-13 07:06:20

标签: c++ multithreading qt runtime-error qt5.3

抱歉,我没有足够的经验来理解我所得到的错误,而且我已经尝试了几周,以了解问题所在。

我需要做什么:
运行多个线程以同时控制硬件和测试。

我的代码:
我按照here提供的示例进行了操作。 此示例也可以在许多其他站点上使用,因此它必须有效。

在我的main代码中,我有:

MotorClass *MotorObj = new MotorClass;
QThread *MotorThread = new QThread;

MotorObj->moveToThread(MotorThread);

connect(MotorThread, SIGNAL(started()), MotorObj, SLOT(RunMotor()));
connect(MotorObj, SIGNAL(finished()), MotorThread, SLOT(quit()));
connect(MotorObj, SIGNAL(finished()), MotorObj, SLOT(deleteLater()));
connect(MotorThread, SIGNAL(finished()), MotorThread, SLOT(deleteLater()));

MotorThread->start();

MotorClass.h我有:

class MotorClass : public QObject
{
    Q_OBJECT
public:
    explicit MotorClass(QObject *parent = 0);
    ~MotorClass();

public slots:
    void RunMotor();

signals:
    void finished();

};

MotorClass.cpp我有:

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

MotorClass::~MotorClass()
{
}

void MotorClass::RunMotor()
{
    qDebug("running");
    emit finished();
}

我的问题:
qDebug()会显示“正在运行”的消息,但随后会出现以下输出,程序崩溃。

QWinEventNotifier: event notifiers cannot be disabled from another thread
QWinEventNotifier: event notifiers cannot be disabled from another thread
QWinEventNotifier: event notifiers cannot be disabled from another thread
The program has unexpectedly finished.

我已经做了多少尝试:
如果我注释掉假设要关闭connectMotorThread的{​​{1}}代码,则错误会消失,但很明显,在一次运行程序很长时间后会导致崩溃。我理解这是因为MotorObjMotorObj并未关闭。 我尝试过其他方法,比如继承MotorThread类,然后重新实现QThread函数,但这并不能满足我的要求,也不是推荐使用run()的方法。< / p>

我出错的任何想法???

2 个答案:

答案 0 :(得分:0)

connect(MotorThread, SIGNAL(started()), MotorObj, SLOT(RunMotor()));
connect(MotorObj, SIGNAL(finished()), MotorThread, SLOT(quit()));
connect(MotorObj, SIGNAL(finished()), MotorObj, SLOT(deleteLater()));
connect(MotorThread, SIGNAL(finished()), MotorThread, SLOT(deleteLater()));

首次执行完成后,您似乎正在删除MotorThread。所以在下一个MotorThread->start()程序应该崩溃,因为它只是一个悬空指针。但是,即使您删除了最后一次连接,也不再存在MotorObj,因此只能调用一次插槽。

为什么不再在不再需要这些物品后立即拨打deleteLater()了??

答案 1 :(得分:0)

确定。所以经过又一周的坐下来试图理解这个奇怪的问题,我找到了解决方案。但我不明白问题发生的原因。我为MotorClass创建了新的头文件和.cpp文件,并将原始文件中的所有代码复制到新文件中。问题消失了。现在一切正常。虽然没有意义。但感谢你们的帮助。