Я вижу странное поведение при использовании библиотеки 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 () вернуться. "
Любая помощь / предложение приветствуются.