因此,如果我理解正确的话,如果我有一个继承 QObject 的类 FunctionsClass
,并且我在名为 FunctionClassThread
的 Qthread 上设置该类,方法是:
FunctionsClass classObj;
classObj.moveToThread( &FunctionClassThread );
FunctionClassThread.start();
据我了解,这种设置线程的方法只会处理 FunctionsClass
中的槽的执行,这意味着运行 FunctionsClass
的线程可以被阻塞,如果由于某种原因, FunctionsClass
中的插槽有一个无限循环。
所以我的问题是:如何在线程上运行 FunctionsClass 的函数而不仅仅是槽?有没有办法将整个对象(函数、成员变量等)放在一个线程上,仅用于执行来自整个对象的代码/数据?我对线程将如何处理槽的执行的理解是否正确?
最佳答案
当您执行一个对象的方法时,它会在您调用该方法的线程中执行。 QObject 位于何处并不重要。
如果你想调用一个方法以便它在另一个线程中异步执行,你必须处理这种情况以便发布消息,等待线程可用(可能很忙,它必须返回首先控制事件循环),然后运行该方法。
这可以通过使用信号和槽以及通常的连接来完成。如果你不想使用那个机制,你可以使用 QMetaObject ,但您仍然必须将它们声明为插槽。静态方法 invokeMethod,如果使用 Qt::QueuedConnection 调用,将在拥有该方法的对象所在的线程中调用该方法。您还可以将参数传递给该方法并从中返回值。
考虑到您希望能够从一个线程传递到另一个线程的任何数据类型都需要使用 qRegisterMetaType 进行注册。并且必须尊重其中报告的条件。
关于c++ - 使用Qt线程的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8191779/