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