es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

QFuture luego continuación nunca termina (Qt 6)

Tengo una pregunta sobre QFuture y su API de continuación then. Considera el siguiente código de ejemplo:

“`c++
auto future = getAccountToken("test@mailprovider.com", "password")
.then([this](QFuture<QString> f) {
auto const token = f.result();
return getGameAccounts(token);
})
.then([this](QFuture<QList<GameAccount>> f) {
auto const gameAccounts = f.result();
// –> LA LÍNEA NUNCA SE ALCANZA (SE ESPERA INDEFINIDAMENTE EN LA LLAMADA f.result())
});

<pre><code><br />Y:

“`c++
QFuture<QString> getAccountToken(/* … */)
{
QPromise<QString> promise;
auto future = promise.future();

promise.start();

QNetworkRequest request(QUrl(“https://example.org”));
// …
auto reply = networkMngr->post(request, doc.toJson());
connect(reply, &QNetworkReply::finished, [reply, p = std::move(promise)]() mutable {
p.addResult(“<TOKEN FROM REPLY>”);
p.finish();

reply->deleteLater();
});

return future;
}

La función getGameAccounts tiene el mismo código básico que getAccountToken, excepto que realiza una solicitud GET en su lugar. ¿Alguien sabe por qué nunca llego a la línea después de auto const gameAccounts = f.result();? Una sola continuación .then funciona bien.
FYI: Tampoco llego a la lambda connect para la respuesta en getGameAccounts, lo que explica por qué nunca tengo ningún resultado. Pero no logro entender por qué sucede eso.

Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Problema con QFuture y su Continuación

    El problema es que la función getGameAccounts() no está devolviendo correctamente el objeto QFuture. El objeto QFuture se crea a partir de una QPromise, que se devuelve antes de que pueda finalizar, lo que provoca que la función then() se llame en un QFuture inacabado.

    Esto se puede solucionar llamando a start() en la promesa antes de devolver el objeto future, opción A, o utilizando un QFutureWatcher en lugar de una promesa para manejar la tarea asíncrona, opción B.

    Además, es recomendable utilizar QFutureWatcher en lugar de promesas para la tarea en cuestión.

    Si las soluciones anteriores no funcionan, es posible que haya un problema con la conexión de red o un retraso en la respuesta del servidor. En tales casos, puede ser necesario realizar pruebas adicionales de depuración y diagnóstico para resolver el problema.

Comments are closed.