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

Qt C++ Is static thread_local QNetworkAccessManager good choice for threaded application?

本文关键字:应用程序 线程 选择 QNetworkAccessManager 静态 C++ thread local Qt      更新时间:2023-10-16

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

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

问题文档说:

一个QNetworkAccessManager实例应该足以容纳整个Qt应用由于QNetworkAccessManager是基于QObject的,它可以只能从它所属的线程中使用。

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...
}