1

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

我需要
完成的任务:同时运行多个线程来控制硬件和测试。

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

在我的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应该关闭MotorThreadand的代码,MotorObj错误就会消失,但显然在一次运行程序很长时间后会导致它崩溃。我知道这是因为MotorObjandMotorThread没有被关闭。我尝试过其他方法,比如继承QThread类然后重新实现run()函数,但这不符合我的要求,也不是推荐的使用QThreads.

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

4

2 回答 2

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()在不再需要对象后不调用权利!?

于 2014-11-13T09:29:58.673 回答
0

好的。因此,又坐了一个星期,试图理解这个奇怪的问题,我找到了解决方案。但是我不明白为什么会出现问题。我为 MotorClass 创建了新的头文件和 .cpp 文件,并将所有代码从原始文件复制到新文件。问题消失了。现在一切正常。虽然根本没有意义。但是感谢您的所有帮助。

于 2014-11-19T12:43:15.040 回答