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

标签 c++ qt qtnetwork

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

One QNetworkAccessManager instance should be enough for the whole Qt application. Since QNetworkAccessManager is based on QObject, it can only 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/

相关文章:

c++ - Qt中的全局变量,如何?

qt - 使用PyQt4 QNetworkAccessManager.post()方法时如何防止表单数据中的 '+'被空格替换

c++ - 以特定排列连接字符串的字符

c# - 使用 C# 的 Windows 10 凭据提供程序

c++ - 十六进制到字符串转换 C++/C/Qt?

c++ - 如何使用 Qt 发送 REST 调用?

c++ - 我无法创建服务器列表

c++ - 内存表大小

c++ - 错误 C2059 : syntax error: 'constant' from struct member declarations

c++ - 根据 QObject 调整 qtvirtualkeyboard 的大小