QT c ++ QFutures с сигналами без QConcurrent, как обещания / наблюдаемые?

Я размышляю, как использовать 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 без блокировки в отдельных потоках

0

Решение

Последовательное устройство асинхронный по своей природе и использование последовательного порта одновременно из нескольких потоков является неопределенным поведением. Конечно, вы можете разрешить фьючерсы из любого потока, но в Qt нет ничего, что могло бы дать вам будущее в том же потоке. Напомним, что QFuture это не тот класс, который вы можете разумно создать. Созданный по умолчанию класс бесполезен.

Чтобы получить представление о том, как обрабатывать асинхронный последовательный ввод-вывод, см., Например, этот ответ.

Тогда вы можете использовать недокументированные <QFutureInterface> заголовок и создайте свою собственную реализацию, которая может обернуть высокоуровневые аспекты вашего протокола, то есть команды / запросы. Затем вы можете сгруппировать такие фьючерсы и использовать одного наблюдателя, чтобы определить, когда они будут сделаны.

Ваш подход довольно интересен на самом деле, и я мог бы разработать полный пример.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]