Skip to content

学习知识

aeagean edited this page Jul 21, 2018 · 1 revision

一.发现问题,此gitlog代码运行会出现闪退,不能自我删除类内存指针详细版本[9111bbaa830d05cb0265c443dcbba2f5f17d582d]

解决方法:

1. 加上这个采用异步的方式Qt::QueuedConnection,即就是将函数执行完毕再触发信号.避免导致先删除了然后再触发信号的现象.

void HttpResponse::slotsMapOperation(QMultiMap<QString, QMap<QString, const QObject *> > &slotsMap)
{
    autoInfterConvertedSupportMethod(slotsMap);

    QMapIterator<QString, QMap<QString, const QObject *> > iter(slotsMap);
    while (iter.hasNext()) {
        iter.next();
        const QString &key = iter.key();
        const QMap<QString, const QObject *> &slotMap = iter.value();

        const QObject *receiver = slotMap.first();
        const QString &receiverSlot = slotMap.firstKey();

        if (methodParams.contains(key)) {
            connect(this,
                    methodParams[key].value("signal").toString().toStdString().data(),
                    receiver,
                    receiverSlot.toStdString().data(),
                    Qt::QueuedConnection);
        }
    }
}

2.这里由于在其他地方有链接到finish信号,其他地方接受到信号就会删除所在内存,包括HttpResponse实例.所以需要设置信号出发为异步,即执行完函数onFinished才触发信号finished即可解决问题.

void HttpResponse::onFinished()
{
    QNetworkReply *reply = (QNetworkReply *)this->parent();
    if (m_slotsMap.contains(N2S(SupportMethod::onResponse_QNetworkReply_A_Pointer)))
        emit finished(reply);
    else if (m_slotsMap.contains(N2S(SupportMethod::onResponse_QByteArray)))
        emit finished(reply->readAll());
    else if (m_slotsMap.contains(N2S(SupportMethod::onResponse_QVariantMap)))
        emit finished(QJsonDocument::fromJson(reply->readAll()).object().toVariantMap());

    reply->deleteLater();
}

3.总结,段错误也会由定时器间隔的异步或者槽的同步自我矛盾导致.