【问题标题】:QT c++ QFutures with signals without QConcurrent, like promises/observables?带有没有 QConcurrent 的信号的 QT c++ QFutures,比如 promises/observables?
【发布时间】:2018-03-30 00:40:56
【问题描述】:

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

【问题讨论】:

  • this-&gt;startTask 格式不正确,您的意思可能是QtConcurrent::run(&amp;RfidCardReader::startTask, this, passed_send)(无论如何都使用QThreadPool::globalInstance()
  • 当然,我没有检查代码,因为它显然无法编译,这不是重点,但无论如何感谢,事实上能够在同样的线程也......我正在努力寻找合适的方法来解决这个问题

标签: c++ qt qfuture


【解决方案1】:

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

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

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

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

【讨论】:

  • 很好的答案,很好的信息,同步不正确,它更像是顺序的,我的意思是你必须在发出另一个请求之前等待一个答案,设备是在单个线程中读取或写入的,但在其他线程中可以向该线程发出并发请求并取回一个未来,一旦它被接管(在队列中的其他请求之前)并且设备发送返回帧或因错误而被拒绝,这是我的行为正在寻找,并且希望不仅用于串行端口,谢谢。
  • @ValentinoMiori 这正是链接答案所涵盖的内容:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多