【问题标题】:(Qt5, Threads) The examples I'm following don't work(Qt5,线程)我遵循的示例不起作用
【发布时间】:2014-11-13 07:06:19
【问题描述】:

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

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

我的代码:
我按照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.


到目前为止我所做的尝试:
如果我注释掉应该关闭MotorThreadMotorObjconnect 代码,错误就会消失,但显然在长时间运行程序后会导致它崩溃。我知道这是因为MotorObjMotorThread 没有被关闭。 我尝试过其他方法,例如继承QThread 类,然后重新实现run() 函数,但这不符合我的要求,也不是使用QThreads 的推荐方式。

有什么想法我错了吗???

【问题讨论】:

  • 你从哪里开始你的话题(不要认为上面一行是唯一的)以及多久开始一次?
  • 您发布的代码没有问题。你还有什么事吗?
  • 嗨。我有一个 MainWindow 作为主线程运行。 MainWindow 代码包含您在上面看到的 Main 代码。从这里我创建了 MotorThread 和 MotorObj。您在我的 MainWindow 中看到的代码仅被调用一次,除了从 MainWindow 代码中的 for 循环调用的 MotorThread.start() 之外。 for 循环在一天内重复大约 5000 次。
  • 会不会连续调用MotorThread.start(),中间没有延迟?
  • 这个循环调用MotorThread->start();。它会检查MotorThread 是否还活着?我的意思是你确实将MotorClass::finished 信号连接到它的deleteLater 插槽。

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


【解决方案1】:
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()!?

【讨论】:

  • 对不起罗伯特。我在上面做了一个错误的陈述。上面显示的所有代码都是从 for 循环中调用的。换句话说......对于for循环的每次迭代,都会创建新的MotorThread和MotorObj,然后将MotorObj移动到MotorThread,然后连接插槽和信号,然后在此之后调用MotorThread.Start,如上所示。但是这个错误的发生也是我只运行了一次for循环。
  • 我认为问题出在我的主代码中,而不是我上面发布的代码。我现在创建了一个新程序并将上面的代码复制到其中。然后它工作。这意味着我在我的主程序中做错了什么。让我去看看我的 MainWindow 代码,我会告诉你我发现了什么。感谢您的反馈意见。至少我开始关注这个问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多