Локальный 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 удаляет некоторые мьютексы, которые заблокированы, и это вызывает сбой программы. Так что кажется, что локальный цикл событий мешает основному, и это странно, потому что Qt
Документация говорит:
"В любое время вы можете создать объект QEventLoop и вызвать для него exec(), чтобы запустить локальный цикл обработки событий. Из цикла обработки событий вызов exit() заставит exec() вернуться".
Любая помощь / предложение будет оценено.