使用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()返回。”
任何帮助/建议将不胜感激。