Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
Qt C++ Is static thread_local QNetworkAccessManager good choice for threaded application?
我使用的是用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...
}
相关文章:
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 通过安装信号处理程序关闭多线程应用程序
- 如何在实时应用程序中锁定线程
- 如何在 MFC 应用程序中启动 ZeroMQ 线程?
- 多线程 gtkmm 应用程序最简单的示例
- 将数组作为多线程应用程序中函数的返回传递
- 修改多线程应用程序中的对象
- 多线程 C++11 应用程序中的同步
- 多线程Windows GUI应用程序中的死锁
- C++多线程应用程序将永远挂起
- 具有多线程应用程序的 Nanomsg 无阻塞双向套接字
- 在 API 和应用程序线程之间共享数据
- 多线程程序线程联接问题
- C++Win32 在低优先级模式下运行应用程序/线程
- 仅在守护程序线程返回后删除它
- 用户模式计划程序线程的最大数量
- GST_DEBUG:如何将日志保存在应用程序内线程的单独文件中
- std::线程实例计数不等于实际应用程序线程计数
- c++程序线程的概念
- CUDA5.0上下文管理,在多GPU环境中使用单个应用程序线程