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。然后,您可以将这些期货分组,并使用一个观察者来确定它们何时完成。
其实你的方法很有意思,我可能会开发一个完整的例子。
我正在思考如何将 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。然后,您可以将这些期货分组,并使用一个观察者来确定它们何时完成。
其实你的方法很有意思,我可能会开发一个完整的例子。