gpt4 book ai didi

c++ - Qt C++ 静态 thread_local QNetworkAccessManager 是线程应用程序的好选择吗?

转载 作者:行者123 更新时间:2023-12-01 14:08:05 26 4
gpt4 key购买 nike

我正在使用用 Qt (C++) 编写的线程应用程序。
我需要经常从单独的线程发出获取/发布请求。
Qt 文档说:

One QNetworkAccessManager instance should be enough for the whole Qtapplication. Since QNetworkAccessManager is based on QObject, it canonly be used from the thread it belongs to.


static thread_local QNetworkAccessManager符合我的目的的好选择?

最佳答案

不,不是一个好的选择。
您不应该创建静态或全局 QObject子类实例,因为您通常需要在创建 Qt 应用程序对象后创建它们(很多 Qt 内容取决于已经存在的应用程序对象)。 C++ 并没有真正提供对实际创建静态对象的时间的很好的控制,在这里您希望拥有这种控制。
只需使用指针和 new创建 QNetworkAccessManager例如,你想要多少就多少。您可以直接在正确的线程中创建它们,也可以在其他(通常是主)线程中创建它们并将它们移动到正确的线程中。
为了让它们被正确销毁,当它们没有自然的父级时(因为父级必须生活在同一个线程中!),连接他们线程的 QThread::finished 向对象发出信号 QObject::deleteLater 槽,当线程完成时,它们将被干净地删除。

如果您想要一个使用当前线程的 QNAM 实例的普通函数,您可以使用线程本地静态指针。就像是

static thread_local *thread_qnam;

void myfunc() {
if (!thread_qnam) {
thread_qnam = new QNetworkAccessManager;
connect(QThread::currentThread, &QThread::finished(), thread_qnam, &QObject::deleteLater);
// Whatever other setup you need.
// It'd probably be good idea to wrap this in a function.
}
// Use thread_qnam...
}

关于c++ - Qt C++ 静态 thread_local QNetworkAccessManager 是线程应用程序的好选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62861893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com