【发布时间】: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.
到目前为止我所做的尝试:
如果我注释掉应该关闭MotorThread 和MotorObj 的connect 代码,错误就会消失,但显然在长时间运行程序后会导致它崩溃。我知道这是因为MotorObj 和MotorThread 没有被关闭。
我尝试过其他方法,例如继承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