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

时间:2018-03-29 15:44:43

标签: c++ qt qfuture

我正在弄清楚如何将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队列中包装一个串行设备(本质上是同步的),但只使用非阻塞代码,使用&amp; QIODevice :: bytesWritten&amp; QIODevice :: readyRead等...如果对问题有更好的解决方案让我知道,我很高兴知道在Qt中编写可读异步代码的正确方法,而不会在单独的线程中阻塞

1 个答案:

答案 0 :(得分:0)

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

要了解如何处理异步串行I / O,请参阅示例source code

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

事实上你的方法非常有趣,我可能会提出一个完整的例子。