抱歉,我没有足够的经验来理解我所得到的错误,而且我已经尝试了几周,以了解问题所在。
我需要做什么:
运行多个线程以同时控制硬件和测试。
我的代码:
我按照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.
我已经做了多少尝试:
如果我注释掉假设要关闭connect
和MotorThread
的{{1}}代码,则错误会消失,但很明显,在一次运行程序很长时间后会导致崩溃。我理解这是因为MotorObj
和MotorObj
并未关闭。
我尝试过其他方法,比如继承MotorThread
类,然后重新实现QThread
函数,但这并不能满足我的要求,也不是推荐使用run()
的方法。< / p>
我出错的任何想法???
答案 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文件,并将原始文件中的所有代码复制到新文件中。问题消失了。现在一切正常。虽然没有意义。但感谢你们的帮助。