Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt C++;静态线程\本地QNetworkAccessManager是线程应用程序的好选择吗?_C++_Qt_Qtnetwork - Fatal编程技术网

C++ Qt C++;静态线程\本地QNetworkAccessManager是线程应用程序的好选择吗?

C++ Qt C++;静态线程\本地QNetworkAccessManager是线程应用程序的好选择吗?,c++,qt,qtnetwork,C++,Qt,Qtnetwork,我使用的是用Qt(C++)编写的线程应用程序 我需要经常从不同的线程发出get/post请求 Qt doc说: 一个QNetworkAccessManager实例对于整个Qt应该足够了 应用由于QNetworkAccessManager基于QObject,因此它可以 只能从它所属的线程使用 静态线程\u本地QNetworkAccessManager对我来说是个好选择吗?不,不是个好选择 您不应该创建静态或全局QObject子类实例,因为您通常需要在创建Qt应用程序对象之后创建它们(很多Qt内容取

我使用的是用Qt(C++)编写的线程应用程序

我需要经常从不同的线程发出get/post请求

Qt doc说:

一个QNetworkAccessManager实例对于整个Qt应该足够了 应用由于QNetworkAccessManager基于QObject,因此它可以 只能从它所属的线程使用

静态线程\u本地QNetworkAccessManager对我来说是个好选择吗?

不,不是个好选择

您不应该创建静态或全局
QObject
子类实例,因为您通常需要在创建Qt应用程序对象之后创建它们(很多Qt内容取决于已经存在的应用程序对象)。在实际创建静态对象时,C++并不能提供非常好的控制,而在这里,您希望拥有该控件。 只需使用一个指针和
new
创建
QNetworkAccessManager
实例,就可以创建任意数量的实例。您可以直接在正确的线程中创建它们,也可以在其他(通常是主)线程中创建它们并将它们移动到正确的线程

为了正确地销毁它们,当它们没有自然父线程(因为父线程必须位于同一线程中!)时,将其线程的信号连接到对象插槽,当线程完成时,它们将被完全删除


如果需要使用当前线程的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...
}

我是否可以在函数内部使用静态线程\本地QNetworkAccessManager来防止每次创建对象以减少内存使用?@Brew在线程启动时,您将创建一次QNAM对象。您可以有一个
thread\u local
指针指向该线程的QNAM实例。