首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QThread诉QFuture

QThread诉QFuture
EN

Stack Overflow用户
提问于 2013-12-11 10:34:39
回答 2查看 1.4K关注 0票数 1

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

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

代码语言:javascript
复制
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能解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2013-12-11 10:54:53

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

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

创建m_networkManager并将'this‘传递给它,使该对象成为其父对象。不管该对象是什么,它都将驻留在原始线程上。不能将子对象移动到与其父线程不同的线程。

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

代码语言:javascript
复制
m_networkManger = new QNetworkAccessManager;

确保您处理删除的networkManager,现在它不再是父级的。

票数 2
EN

Stack Overflow用户

发布于 2013-12-11 11:56:16

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

如果对象有一个父对象,那么它就是moveToThread (什么都不做,只在日志中打印错误)。

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

注意,您可以在不同的线程中运行对象方法,然后对象属于。如果对象属于某个线程,这意味着该对象的连接槽将倾向于从该线程调用(只有当连接类型为Qt::DirectConnection时隙可以从不同的线程调用)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20516763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档