Локальный QEventLoop мешает основному - PullRequest
0 голосов
/ 22 февраля 2019

Я вижу странное поведение при использовании библиотеки 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 удаляет некоторые заблокированные мьютексы, что вызывает сбой программы.Таким образом, кажется, что локальный цикл обработки событий мешает основному, и это странно, потому что документация Qt гласит:

"В любой момент вы можете создать объект QEventLoop и вызвать exec (), чтобы запустить локальный цикл событий. Из цикла событий вызов метода exit () заставит exec () вернуться. "

Любая помощь / предложение приветствуются.

...