Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Qt线程的混淆_C++_Multithreading_Qt_Signals Slots_Qt Signals - Fatal编程技术网

C++ 使用Qt线程的混淆

C++ 使用Qt线程的混淆,c++,multithreading,qt,signals-slots,qt-signals,C++,Multithreading,Qt,Signals Slots,Qt Signals,因此,如果我理解正确,如果我有一个继承QObject的类FunctionsClass,并且我通过执行以下操作在名为FunctionClassThread的Qthread上设置该类: FunctionsClass classObj; classObj.moveToThread( &FunctionClassThread ); FunctionClassThread.start(); 据我所知,这种设置线程的方法只处理函数类中插槽的执行,这意味着如果函数类中的插槽由于某种原因具有无限循环

因此,如果我理解正确,如果我有一个继承QObject的类
FunctionsClass
,并且我通过执行以下操作在名为
FunctionClassThread
的Qthread上设置该类:

FunctionsClass classObj; 
classObj.moveToThread( &FunctionClassThread );
FunctionClassThread.start();
据我所知,这种设置线程的方法只处理
函数类
中插槽的执行,这意味着如果
函数类
中的插槽由于某种原因具有无限循环,则运行
函数类
的线程可能会被阻塞


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

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

如果您想从其他线程调用该类上的方法,但仍然让它们在工作线程的上下文中运行,那么您需要某种方法来获取到工作线程的消息,以便它可以调用您想要的方法。这基本上是通过Qt信号和插槽在线程边界交叉时实现的

有了大量的额外工作,还有两种方法可以做同样的事情。首先,
QThread
s有一个事件循环,如果不重写
run()
,该循环将在默认情况下启动。您可以创建一个可以发布到事件循环的事件,该事件循环可以触发类中将在工作线程上下文中执行的活动


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

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

如果您想从其他线程调用该类上的方法,但仍然让它们在工作线程的上下文中运行,那么您需要某种方法来获取到工作线程的消息,以便它可以调用您想要的方法。这基本上是通过Qt信号和插槽在线程边界交叉时实现的

有了大量的额外工作,还有两种方法可以做同样的事情。首先,
QThread
s有一个事件循环,如果不重写
run()
,该循环将在默认情况下启动。您可以创建一个可以发布到事件循环的事件,该事件循环可以触发类中将在工作线程上下文中执行的活动


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

当您执行对象的方法时,它将在调用该方法的线程中执行。QoObject住在哪里并不重要

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

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


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

当您执行一个对象的方法时,它是在您调用该方法的线程中执行的。QoObject住在哪里并不重要

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

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

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