从 NetworkAccessManager->get() 回调访问 QList<QLlnkedList<QUrl>* > 时 Qt 应用程序冻结

Posted

技术标签:

【中文标题】从 NetworkAccessManager->get() 回调访问 QList<QLlnkedList<QUrl>* > 时 Qt 应用程序冻结【英文标题】:Qt application freezes when accessing QList<QLlnkedList<QUrl>* > from NetworkAccessManager->get() callback 【发布时间】:2014-11-08 16:13:58 【问题描述】:

当我尝试访问 replyFinished(QNetworkReply* networkReply); 插槽内的 QList&lt;QLinkedList&lt;QUrl&gt;* &gt; QNetworkAccessManager 时,我的应用程序冻结。

我基本上在列表上循环一次,向列表中添加一些内容,然后退出函数:

foreach (QLinkedList<QUrl>* list, mList) 
    if (list->front() == url) 
        list->prepend(someUrl);
        mNetworkAccessManager->get(someUrl);
        return; 
    

在另一种情况下,我执行以下操作:

QList<QLinkedList<QUrl>* >::iterator it = mList.begin();
while (it != mList.end()) 
    QLinkedList<QUrl>* list = *it;
    if (list->front() == networkReply->url()) 
        // some operation with list->back();
        mList.erase(it);
        delete list;
        break;
    

有什么方法可以保证这个结构的安全吗?

【问题讨论】:

指向 url 链接列表的指针列表看起来非常可怕。我有一个词要告诉你——调试。 是的,不要使用指针 即使我不使用指针,我的应用程序也会崩溃。我认为原因是插槽replyFinished 被多次调用,而QListQLinkedList 不是线程安全的。 【参考方案1】:

我陷入了无限循环,因为

QList<QLinkedList<QUrl>* >::iterator it = mList.begin();
while (it != mList.end()) 
    QLinkedList<QUrl>* list = *it;

从不增加迭代器..

【讨论】:

以上是关于从 NetworkAccessManager->get() 回调访问 QList<QLlnkedList<QUrl>* > 时 Qt 应用程序冻结的主要内容,如果未能解决你的问题,请参考以下文章

QT NetworkAccessManager 未知错误

QNetworkAccessManager 不起作用

Pyside qwebview 自定义协议

如何在 PyQt 中屏蔽广告

Qt 多部分帖子问题

BB10 QNX Momentics IDE 中的 SSL 握手失败