gpt4 book ai didi

c++ - 如何拥有一个 QNetworkAccessManager 实例?

转载 作者:行者123 更新时间:2023-11-30 03:23:00 29 4
gpt4 key购买 nike

有一个类似的question但我没有发现它对我的问题有用。

在 Qt 中 documentation ,他们说:

One QNetworkAccessManager instance should be enough for the whole Qt application.

在我的应用程序中,我在多个地方使用了QNetworkAccessManager(它们可能被同时调用)并且每次我都在堆栈上创建新的实例。阅读该引用后,我更改了我的代码以拥有一个静态 QNetworkAccessManager 并在任何地方使用它。将其更改为静态成员后,我总是收到警告:

QObject::connect: Cannot connect (null)::aboutToQuit() to QNativeWifiEngine::closeHandle()

在这两种情况下,代码都没有错误地工作,但是,该文档让我有点困惑。由于该产品将要商业化,我会认真对待这个问题。我应该遵循文档还是避免警告?或者您有其他建议吗?

如果不同线程上的对象需要使用 QNetworkAccessManager 怎么办?


编辑:添加代码

单例设置类:

class ConnectionSettingsSingleton
{
...
// constructors = default
// copy constructor = delete

public:
static QNetworkAccessManager networkAccessManager;
}

我在不同的地方使用了networkAccessManager,但是都是一样的:

QNetworkReply* HttpClient::makeRequest()
{
switch (this->method) {
case RequestMethod::GET:
return ConnectionSettingsSingleton::networkAccessManager.get(this->serverRequest);
case RequestMethod::POST:
return ConnectionSettingsSingleton::networkAccessManager.post(this->serverRequest, QJsonDocument(this->data).toJson());
case RequestMethod::DELETE:
return ConnectionSettingsSingleton::networkAccessManager.deleteResource(this->serverRequest);
default:
return nullptr;
}
}


编辑-2

我很乐意使用 Kuba Ober's answer有一次我收到了这个警告:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNetworkAccessManager(0x26f6d0), parent's thread is QThread(0x2b73b8), current thread is QThread(0xa4f20a8)

原因:我试图从不同的线程访问QNAM。因此,我更新了我的问题。

最佳答案

您可以随意使用整个 Qt。不要为此使用静态变量 - 你无法控制它们的生命周期,而且生命周期几乎总是错误的。当 QCoreApplication 不存在时,QNetworkManager 不应存在。该警告根本不是良性的——它表示一个基本的设计问题。 需要控制管理器的生命周期,并确保它不会超过QApplication。管理此类全局应用程序绑定(bind)对象的规范方法是将它们作为自动变量保存在 main 中,并使用辅助函数来访问它们。 QPointer 自动跟踪对象的生命周期,因此永远不会悬空。因此:

main.h - 界面

QNetworkAccessManager *nMgr();

main.cpp - 实现

// This pointer is local to the translation unit, and is an
// implementation detail. It's not used anywhere else.
static QPointer<QNetworkAccessManager> globalManager;

// The global accessor method
QNetworkAccessManager *nMgr() {
Q_ASSERT(!qApp || QThread::currentThread() == qApp->thread());
return globalManager;
}

int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QNetworkAccessManager mgr;
globalManager = &mgr;
...
}

关于c++ - 如何拥有一个 QNetworkAccessManager 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691136/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com