0

我正在研究如何将 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 中编写可读异步代码而不阻塞单独线程的正确方法

4

1 回答 1

0

串行设备本质上是异步的,并且从多个线程同时使用串行端口是未定义的行为。您当然可以从任何线程解决未来,但 Qt 中没有任何东西可以让您在同一个线程上获得未来。回想一下,aQFuture不是您可以明智地实例化的类。默认构造的类是无用的。

要了解如何处理异步串行 I/O,请参阅此答案

然后您可以使用未记录的<QFutureInterface>标头,并创建您自己的实现,该实现可以包装您的协议的更高级别方面,即命令/请求。然后,您可以对此类期货进行分组,并使用单个观察者来确定它们何时完成。

实际上,您的方法很有趣,我可能会开发一个完整的示例。

于 2018-03-29T16:40:56.717 回答