我正在弄清楚如何将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中编写可读异步代码的正确方法,而不会在单独的线程中阻塞
答案 0 :(得分:0)
串行设备本质上是异步,并且从多个线程同时使用串行端口是未定义的行为。你当然可以解决任何线程中的期货,但Qt中没有什么可以让你在同一个线程上有未来。回想一下,QFuture
不是一个可以明智地实例化的类。默认构造的类是无用的。
要了解如何处理异步串行I / O,请参阅示例source code。
然后,您可以使用未记录的<QFutureInterface>
标头,并创建自己的实现,可以包含协议的更高级别方面,即命令/请求。然后,您可以对此类期货进行分组,并使用单个观察程序来确定它们何时完成。
事实上你的方法非常有趣,我可能会提出一个完整的例子。