从 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<QLinkedList<QUrl>* >
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
被多次调用,而QList
和QLinkedList
不是线程安全的。
【参考方案1】:
我陷入了无限循环,因为
QList<QLinkedList<QUrl>* >::iterator it = mList.begin();
while (it != mList.end())
QLinkedList<QUrl>* list = *it;
从不增加迭代器..
【讨论】:
以上是关于从 NetworkAccessManager->get() 回调访问 QList<QLlnkedList<QUrl>* > 时 Qt 应用程序冻结的主要内容,如果未能解决你的问题,请参考以下文章