Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
QThread Vs QFuture_Qt_Qthread - Fatal编程技术网

QThread Vs QFuture

QThread Vs QFuture,qt,qthread,Qt,Qthread,哪个更合适:QThread还是QFuture? 我试图在QThread中传递QNetWorkAccessManager,但它导致父线程和子线程出错:/ QObject:无法为位于不同线程中的父线程创建子线程。 (父线程是QNetworkAccessManager(0xc996cf8),父线程是QThread(0xaba48d8),当前线程是Citizen(0xca7ae08) 使用QFuture可以解决问题吗?我的第一个想法是,为什么要将networkManager移动到其他线程 无论如何,您看

哪个更合适:QThread还是QFuture? 我试图在QThread中传递QNetWorkAccessManager,但它导致父线程和子线程出错:/

QObject:无法为位于不同线程中的父线程创建子线程。 (父线程是QNetworkAccessManager(0xc996cf8),父线程是QThread(0xaba48d8),当前线程是Citizen(0xca7ae08)


使用QFuture可以解决问题吗?

我的第一个想法是,为什么要将networkManager移动到其他线程

无论如何,您看到的问题是,当您将对象移动到新线程时,它会移动对象及其子线程

创建m_networkManager并将“this”传递给它,使该对象成为其父对象。无论该对象是什么,它都将驻留在原始线程上。不能将子对象从其父对象移动到其他线程

因此,请在创建QNetworkAccessManager时删除父对象“this”

m_networkManger = new QNetworkAccessManager;

确保您处理了networkManager的删除,因为它不再是父线程。

我的第一个想法是,为什么要将networkManager移动到其他线程

无论如何,您看到的问题是,当您将对象移动到新线程时,它会移动对象及其子线程

创建m_networkManager并将“this”传递给它,使该对象成为其父对象。无论该对象是什么,它都将驻留在原始线程上。不能将子对象从其父对象移动到其他线程

因此,请在创建QNetworkAccessManager时删除父对象“this”

m_networkManger = new QNetworkAccessManager;

确保您处理networkManager的删除,因为它不再是父线程。

移动到其他线程的对象不能有父线程。Qt的设计方式是,整个对象树必须在一个线程中(对象及其所有子线程移动到其他线程)

如果对象有父对象,则它将
moveToThread
将失败(不执行任何操作仅在日志中打印错误)

在这种情况下,QFuture不会改变任何事情


请注意,您可以在对象所属的不同线程中运行对象方法。如果对象属于某个线程,则意味着此对象的已连接插槽将倾向于从此线程调用(仅当连接类型为
Qt::DirectConnection
插槽可从不同线程调用时).

移动到其他线程的对象不能有父线程。Qt的设计方式是,整个对象树必须在一个线程中(对象及其所有子线程都移动到其他线程)

如果对象有父对象,则它将
moveToThread
将失败(不执行任何操作仅在日志中打印错误)

在这种情况下,QFuture不会改变任何事情


请注意,您可以在对象所属的不同线程中运行对象方法。如果对象属于某个线程,则意味着此对象的已连接插槽将倾向于从此线程调用(仅当连接类型为
Qt::DirectConnection
插槽可从不同线程调用时).

此外,在删除父级时,添加
连接(m_线程,信号(finished()),m_网络管理器,插槽(deleteLater());
此外,在删除父级时,添加
连接(m_线程,信号(finished()),m_网络管理器,插槽(deleteLater())可能是一个好主意
要实现的重要细节:
QThread
是线程控制器,它必须与它控制的线程具有不同的线程亲缘关系。子
QObject
必须与其父
QObject
具有相同的线程亲缘关系。您必须在网络管理器上执行moveToThread操作,以及要实现的重要细节:
QThreade> 是线程控制器,它必须与它控制的线程具有不同的线程关联性。子
QObject
必须与其父
QObject
具有相同的线程关联性。您还必须在网络管理器上执行moveToThread操作