QT c++ QFutures 带有没有 QConcurrent 的信号,比如 promises/observables?

QT c++ QFutures with signals without QConcurrent, like promises/observables?

我正在思考如何将 Futures 与非阻塞事件驱动的代码一起使用(在单独的线程中或不在单独的线程中,两者都有)但是我如何从插槽中结束未来(〜根据信号解决承诺) ?

QByteArray RfidCardReader::startTask(QByteArray send)
{
    if(this->busy==false) {
        this->sendFrame(send);

        QObject::connect(this, &RfidCardReader::frameReady,
        [=]() {/*this must be the startTask return*/ return this->int_read_buffer;});

    } else {
        throw 0;//Handle a queue instead
    }
}

QFuture<QByteArray> RfidCardReader::send(QByteArray passed_send)
{
    return QtConcurrent::run(QThreadPool::globalInstance(), this->startTask, passed_send);

}

基本上我只想使用一个实例来做的是将串行设备(本质上是同步的)包装在 Futures 队列中,但只有非阻塞代码使用像 &QIODevice::bytesWritten &QIODevice::readyRead 等信号...如果有更好的方法来解决这个问题让我知道,我很高兴知道在 Qt 中编写可读异步代码而不阻塞在单独的线程中的正确方法

串行设备本质上是异步,并且从多个线程并发使用串行端口是未定义的行为。您当然可以从任何线程解决未来,但 Qt 中没有任何东西可以在同一线程上为您提供未来。回想一下,QFuture 不是您可以明智地实例化的 class。 default-constructed class没用

要了解如何处理异步串行 I/O,请参见示例 this answer

然后您可以使用未记录的 <QFutureInterface> header,并创建您自己的实现来包装协议的 higher-level 方面,即 commands/requests。然后,您可以将这些期货分组,并使用一个观察者来确定它们何时完成。

其实你的方法很有意思,我可能会开发一个完整的例子。