我正在使用用 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/