2011-11-19 66 views
1

所以,如果我理解正确的话,如果我有一个类FunctionsClass继承QObject的,我设置等级可达上的QThread做称为FunctionClassThread混乱使用Qt线程

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

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

所以我的问题是:我如何在一个线程上运行函数类的函数而不仅仅是插槽?有没有一种方法可以将整个对象(函数,成员变量等)放置在线程上,以便仅执行整个对象中的代码/数据?并且我理解线程如何处理插槽的执行是否正确?

回答

1

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

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

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

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

0

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

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

随着大量额外的工作,还有两种其他方式可以做同样的事情。首先,如果您不覆盖run(),则QThread有一个默认启动的事件循环。您可以创建custom events,您可以发布到事件循环中,这可以触发您的类中将在工作线程上下文中执行的活动。

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