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

我需要完成的工作:
运行多个线程以同时控制硬件和测试。

我的密码:
我按照提供的示例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.


我尝试过的东西很远:
如果我注释掉应该关闭connectMotorThreadMotorObj代码,则错误消失了,但是很明显,一次长时间运行该程序会导致崩溃。我了解这是因为MotorObjMotorThread没有关闭。
我尝试了其他方法,例如继承QThread类,然后重新实现run()函数,但这不满足我的要求,也不推荐使用QThread的方法。

任何想法,我要去哪里错了???

最佳答案

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

10-07 23:26