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 без блокировки в отдельных потоках

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам