我有一个用于请求数据的异步调用的信号/插槽安排。通常这很好,因为接收到的数据只是更新控件。但在某些情况下,我必须等待对请求的回复以确保操作完成,然后再进行下一步。每次有效接收数据排队时都会触发一个信号。
还需要阻塞写入,但读/写机制几乎相同。
以下使用本地事件循环的代码模式(我相信)是等待信号的标准模式。
但是信号是用额外的数据发送的,在这种情况下是地址和其他东西。
我需要检查信号是否与请求相关联,否则我可能会过早地继续下一步。
当接收槽不知道如何处理它时,我如何接收额外的(地址)数据,因为在这种情况下,槽是一个事件循环(或计时器)。
我真的必须继承 QEventLoop 还是有更简单的方法?
以下是一个稍微简化/人为的示例。
quint16 System::blockingRead(quint16 address)
{
QTimer timer;
timer.setSingleShot(true);
QEventLoop loop;
connect( this, &System::readComplete, &loop, &QEventLoop::quit );
connect( &timer, &QTimer::timeout, &loop, &QEventLoop::quit );
timer.start(3000);
ReadFromSystem(address); // Asynchronous call
bool waiting = true;
bool timeout = false
do {
loop.exec();
waiting = loop.getReceivedAddress() == address;
timeout = not timer.isActive();
while(waiting and not timeout);
if(not timeout) {
return(loop.getExtraData());
}
else {
throw ECRException();
qDebug("timeout");
}
}