2010-02-25 98 views
0

我是新来QT。我创建了对象类QNetworkAccessManager主窗口作为父项。还注册完成SIGNAL。它工作正常。 但我想知道它将在哪个线程中运行。它会阻止主线程吗?如果我需要执行get操作的顺序,我应该如何编写代码。 请给我一些示例,以正确理解概念。QNetworkAccessManager处理异步线程

回答

2

它肯定不会在主线程中运行,调用得到()是异步的。

例如,这将持续触发GET请求:

while (condition) { 
    QNetworkRequest request; 
    request.setUrl(QUrl(m_ServerURL); 
    m_httpGetUpdatedFile->get(request); 
} 

你就必须为它处理QNetworkReply完成信号的插槽。那个插槽基本上应该会针对你所做的每个获取请求进行调用(即使它失败了)。如果您需要跟踪所有获取请求的完成时间,则需要跟踪您发布的帖子数量,然后拥有自己的完成标志或信号。

+0

感谢重播。 是完成插槽将在主线程中运行? 如果它在主线程中运行,它将阻塞主线程。为此我正在使用一个样本作为波纹管。 ---- QNetworkAccessManager管理器; QEventLoop q; QTimer tT; tT.setSingleShot(true); connect(&tT,SIGNAL(timeout()),&q,SLOT(quit())); connect(&manager,SIGNAL(finished(QNetworkReply *)),&q,SLOT(quit())); QNetworkReply * reply = manager.get(QNetworkRequest(QUrl(“URL”))); tT.start(5k); q.exec(); ------ 是此方法correct.I'm计划运行在辅助线程上面的代码。 如果我在辅助线程中运行它会出现问题。 – 2010-03-02 06:44:52

0

QNAM不使用线程在后台,但是这是为你的应用程序代码完全不可见。你看到的所有东西都会在主线程中运行。

QNAM在通常的Qt的方式工作,它会发出信号时,事情发生了,你将这些信号连接到自己的代码插槽,做事多,因为他们可以。如果他们没有足够的数据,那么你的插槽不能阻塞等待新数据,他们必须返回。然后当/如果有更多的数据时他们会再次被调用(或者如果例如连接被终止,你会得到另一个信号)。

一些链接,如果你没有看过这些: