1

因此,如果我理解正确,如果我有一个FunctionsClass继承 QObject 的类,并且我将该类设置在一个调用的 Qthread 上FunctionClassThread

FunctionsClass classObj; 
classObj.moveToThread( &FunctionClassThread );
FunctionClassThread.start();

据我了解,这种设置线程的方法只会处理 中的插槽的执行FunctionsClass,这意味着如果某个插槽由于某种原因具有无限循环,FunctionsClass则可以阻止正在运行的线程。FunctionsClass

所以我的问题是:如何在线程上运行 FunctionsClass 的函数而不仅仅是插槽?有没有办法将整个对象(函数、成员变量等)放在一个线程上,以便仅执行来自该整个对象的代码/数据?我对线程如何处理插槽执行的理解是否正确?

4

2 回答 2

1

当您执行对象的方法时,它会在您调用该方法的线程中执行。QObject 生活在哪里并不重要。

如果您想调用一个方法以便它在另一个线程中异步执行,您必须处理这种情况以便发布消息,等待线程可用(可能很忙,它必须将控制权返回给首先是事件循环),然后运行该方法。

这可以通过通常的连接使用信号和插槽来完成。如果您不想使用该机制,则可以使用QMetaObject,但您仍然必须将它们声明为插槽。静态方法invokeMethod,如果使用Qt::QueuedConnection 调用,将在拥有该方法的对象所在的线程中调用该方法。您还可以将参数传递给方法并从中返回值。

考虑到您希望能够从一个线程传递到另一个线程的任何数据类型都需要使用qRegisterMetaType进行注册,并且必须遵守其中报告的条件。

于 2011-11-19T10:18:31.320 回答
0

类的方法将在调用它们的线程的上下文中执行。如果将 QObject 类移动到线程(我们将其称为工作线程),那么只有从工作线程的方法直接(或间接)调用的该类的run()方法才会在工作线程的上下文中执行.

如果您想从其他线程调用该类上的方法,但仍让它们在工作线程的上下文中运行,那么您需要某种方法来向工作线程发送消息,以便它可以调用您想要的方法。这本质上是跨越线程边界时 Qt 信号和槽实现的。

有很多额外的工作,还有其他两种方法可以做同样的事情。首先,QThreads 有一个事件循环,如果你不覆盖它,它会默认启动run()。您可以创建可以发布到事件循环的自定义事件,该事件循环可以触发您的类中的活动,该活动将在工作线程的上下文中执行。

第二种方法是从另一个线程调用类中的方法来修改工作线程监视的类字段。您需要确保对任何这些字段的访问与某种机制(如互斥锁)同步。

于 2011-11-19T04:49:02.530 回答