gpt4 book ai didi

c++ - 如何编写第二个线程来监听传入的信号?

转载 作者:太空狗 更新时间:2023-10-29 21:19:39 25 4
gpt4 key购买 nike

我有一个关于 Qt 中的 Slot-/Signal-architecture 的问题。对于我的项目,我有单独的功能:

a) 界面
b) 控制外部设备

现在我想要功能 b) 在特定插槽上不断收听从 a) 发送的信号。但是这种监听不应该影响 GUI 线程,例如我想在那里继续我的工作。

因此我有了将函数 b) 移动到单独线程的想法。但我的问题是我不知道如何在该线程中创建 run 函数。它应该从我的程序开始(没问题),它应该不断地监听传入的信号,然后运行连接到这个信号的函数。

一个简单的 while(1) 就足够了吗?

最佳答案

Qt 使这变得非常简单。我不建议为此重写 run(),因为这不是必需的 - 而且它不那么灵活或易于实现,并且有一些关于对象创建的注意事项。

相反,只需创建一个线程,然后将您的监听对象移动到它。例如:

// 'this' as parent means thread will terminate automatically when 'this'
// is deleted, you have other options here, of course.
QThread *thread = new QThread(this);

// Create your object (or just use an existing one). Note new object initially
// lives on current thread. Note also it does not have a parent. Objects with
// parents cannot be moved to other threads explicitly.
MyObject *object = new MyObject(); // Assuming MyObject is a QObject.

// Now move the object to the new thread.
object->moveToThread(thread);

// And, you'll want to make sure the object is deleted when the thread ends.
connect(thread, SIGNAL(finished()), object, SLOT(deleteLater()));
connect(thread, SIGNAL(terminated()), object, SLOT(deleteLater())); // just in case

// Finally, start the thread:
thread->start();

这就是您需要做的全部!现在线程正在运行,它有自己的事件循环,连接到对象槽的信号将排队并在该线程上运行

请注意,如果您的对象的构造函数创建了它自己的任何 QObject,它应该相应地将自己设置为那些对象的父对象。当您执行 object->moveToThread() 时,Qt 也会自动将您对象的所有子对象移动到线程。

您可以将任意数量的对象移动到给定的QThread,它不仅限于一个。

要显式结束线程并清理对象,调用thread->exit() 或直接删除线程。同样,由于我们在上面的示例中将 this 设为 QThread 的父级,因此您实际上根本不需要进行任何清理。

顺便说一句,如果你有一些初始化或其他任务,你的对象应该在线程启动时在线程上执行,你也可以使用线程的started()信号:

connect(thread, SIGNAL(started()), object, SLOT(initializeWhatever()));

当然要注意,以上方式使用的任何对象都必须是QObject的子类。这是例如moveToThread()deleteLater() 是正确处理插槽所必需的:

class MyObject : public QObject {
Q_OBJECT
public:
MyObject (QObject *parent = 0);
signals:
...
public slots:
...
};

实际上,最简单的设置方法是在 QtCreator 中,右键单击,添加一个新类,然后选择 QObject 作为基础。 Qt 将为您设置模板头文件和源文件。


除非连接类型是 DirectConnection ,但默认情况下不是。

关于c++ - 如何编写第二个线程来监听传入的信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com