本地QEventLoop会干扰主要的

时间:2019-02-22 13:45:47

标签: qt qeventloop

使用qtPromise库和QJsonRpc时,我看到一个奇怪的行为。

我创建了一个叫QJsonRpcSocket::invokeRemoteMethodBlocking()的承诺。

QJsonRpcSocket::sendMessageBlocking(const QJsonRpcMessage &message, int msecs)内部,有一个本地QEventLoop被执行。

QJsonRpcMessage QJsonRpcSocket::sendMessageBlocking(const QJsonRpcMessage &message, int msecs)
{
    Q_D(QJsonRpcSocket);
    QJsonRpcServiceReply *reply = sendMessage(message);
    QScopedPointer<QJsonRpcServiceReply> replyPtr(reply);

    QEventLoop responseLoop;
    connect(reply, SIGNAL(finished()), &responseLoop, SLOT(quit()));
    QTimer::singleShot(msecs, &responseLoop, SLOT(quit()));
    responseLoop.exec();

    if (!reply->response().isValid()) {
        d->replies.remove(message.id());
        return message.createErrorResponse(QJsonRpc::TimeoutError, "request timed out");
    }

    return reply->response();
}

执行时,qt promise会删除一些已锁定的互斥锁,这会导致程序崩溃。 因此,似乎本地事件循环会干扰主要事件循环,这很奇怪,因为Qt的文档说:

  

“任何时候,您都可以创建QEventLoop对象并对其调用exec()以启动本地事件循环。从事件循环内部,调用exit()将强制exec()返回。”

任何帮助/建议将不胜感激。

0 个答案:

没有答案