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.
davy.ai
Problema con QFuture y su Continuación
El problema es que la función
getGameAccounts()
no está devolviendo correctamente el objetoQFuture
. El objetoQFuture
se crea a partir de unaQPromise
, que se devuelve antes de que pueda finalizar, lo que provoca que la funciónthen()
se llame en unQFuture
inacabado.Esto se puede solucionar llamando a
start()
en la promesa antes de devolver el objeto future, opción A, o utilizando unQFutureWatcher
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.