哪个更合适: QThread 或 QFuture ? 我正在尝试在 QThread 中传递 QNetWorkAccessManager ,但它会导致父线程和子线程出错:/
QObject:无法为不同线程中的父级创建子级。 (Parent是QNetworkAccessManager(0xc996cf8),父线程是QThread(0xaba48d8),当前线程是Citizen(0xca7ae08)
m_networkManger = new QNetworkAccessManager(this);
m_thread = new QThread();
m_data = new LoadData(m_labelsList, m_parserType, argUrl, m_networkManger);
m_data->moveToThread(m_thread);
connect(m_thread, SIGNAL(started()), m_data, SLOT(process()));
connect(m_thread, SIGNAL(finished()), m_thread, SLOT(deleteLater()));
m_thread->start();
可以使用QFuture解决问题吗?
答案 0 :(得分:2)
移动到其他线程的对象不得包含父对象。 Qt的设计方式是整个对象树必须在一个线程中(对象被移动到其所有子节点的其他线程)。
如果对象有父对象,则moveToThread
将失败(不执行任何操作只会在日志中打印错误)。
在这种情况下,QFuture不会改变任何内容。
请注意,您可以在对象所属的不同线程中运行对象方法。如果对象属于某个线程,则意味着该对象的连接槽将倾向于从该线程调用(仅当连接类型为Qt::DirectConnection
时,才能从不同的线程调用插槽)。
答案 1 :(得分:1)
我的第一个想法是你为什么要将networkManager移动到另一个不同的线程?
无论如何,您看到的问题是,当您将对象移动到新线程时,它会移动对象及其子对象。
您创建m_networkManager并将'this'传递给它,使该对象成为其父对象。无论该对象是什么,它都将驻留在原始线程上。您不能将子对象移动到与其父对象不同的线程。
因此,在创建QNetworkAccessManager时删除父对象'this'。
m_networkManger = new QNetworkAccessManager;
确保您处理删除networkManager,现在它已不再是父级。