[QT] Transformer une fonction asynchrone en fonction synchrone

QT propose aux programmeurs un ensemble de bibliothèque qui nous simplifie vraiment la vie. Mais certaines fonction sont asynchrone et il faut utiliser le système de signal/slots pour les utiliser correctement. Dans certains cas cela peut rendre le code lourd et pas évident a coder.

Prenons en exemple le téléchargement d’une page web:

QHttp *http = new QHttp(this);
http->setHost("monsite.fr");
http->get("/mapage.php");
qDebug()<<http->readAll();

Au moment de faire le readAll la page n’est pas forcement téléchargée (c’est même quasi sur). La théorie voudrais qu’on relis le signal done() de QHttp à un slot spécifique pour traiter ca. Mais ca ne me convient pas vraiment… j’aimerais que ma fonction soit bloquante. La technique est d’utiliser un QEventLoop:

    QHttp *http = new QHttp(this);
    QEventLoop loop;
    connect(http, SIGNAL(done(bool)), &loop, SLOT(quit()));
    http->setHost("monsite.fr");
    http->get("/mapage.php");
    loop.exec(QEventLoop::AllEvents|QEventLoop::WaitForMoreEvents);
    qDebug()<<readAll();

Ici on relis donc le signal done de QHttp a quit() de QEventLoop, puis on lance la boucle, cette boucle est bloquante jusqu’a l’appel à quit() qui se fera quand le signal done sera émis, donc quand le fichier sera fini de télécharger.

Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

Tags: , , , , , ,

Leave a Reply