【问题标题】:Qt 4 GUI application GUI thread slows with QNetworkRequestsQt 4 GUI 应用程序 GUI 线程因 QNetworkRequests 而变慢
【发布时间】:2012-10-12 04:11:44
【问题描述】:

我正在开发一个应用程序来跟踪在线 Xbox Live、PSN 和 Steam 朋友。应用程序使用 QNetworkAccessManager 执行一系列 QNetworkRequest。 Xbox Live 和 PSN 代码使用 QWebView 来模拟浏览器环境。请求正确执行,但它会减慢主 GUI 线程,直到每个请求完成。

下面是一些示例代码:

void Steam::fetchFriends(QString username)
{
    QNetworkRequest userXml("http://steamcommunity.com/id/" + username + "/friends/?xml=1");
    m_nam->get(userXml);
}

我创建了一个信号来告诉 GUI 朋友已被下载和处理。然后在 GUI 中更新好友列表。我的一些其他代码更复杂,我可能需要将处理代码移动到另一个线程。

有人可以确认 QNetworkAccessManager 和 QNetworkRequest 是多线程的还是应该将它们移到单独的线程中?

【问题讨论】:

    标签: multithreading user-interface qt4


    【解决方案1】:

    QNetworkAccessManager 在其实现中没有线程化。它是异步的并使用事件循环。

    那些声称出于性能原因需要在线程状态下使用它的人指出,他们需要专门在线程中创建实例,而不是尝试将其移动到线程中。这是link to someone posting an example of such

    在单独的线程中创建它之前,请首先确保您没有执行任何可能导致主线程变慢的阻塞操作。

    【讨论】:

    • 感谢您的澄清。在进一步调查中,我的状态机似乎是我的应用程序的阻塞操作符。我有一个用于 Xbox Live、PSN 和 Steam 的状态机设置,用于监控登录、处理朋友和其他事情。问题是,为了达到我的状态机中的下一个状态,它需要完成对当前状态的操作(不管这可能需要多长时间)。我将尝试将我的状态机移动到一个新线程中,看看它是如何工作的。每次页面加载和处理事件后,状态都会发生变化。
    • 状态机不是问题。执行阻塞操作的是 QtWebkit。在 QtWebkit 的 QWebView 中完成请求时,我还没有找到恢复绘制 GUI 的方法。我会再调查一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多