C++ Qt C++;静态线程\本地QNetworkAccessManager是线程应用程序的好选择吗?
我使用的是用Qt(C++)编写的线程应用程序 我需要经常从不同的线程发出get/post请求 Qt doc说: 一个QNetworkAccessManager实例对于整个Qt应该足够了 应用由于QNetworkAccessManager基于QObject,因此它可以 只能从它所属的线程使用 静态线程\u本地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内容取
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实例。