En fait, QtConcurrent va bien permettre d'effectuer une synchronisation.
QtConcurrent permet d'utiliser autant de threads qu'il y a de coeur disponible sur la machine (utilisation d'une file d'attente s'il n'y a pas de coeur disponible).
L'intérêt, c'est surtout de ne pas se prendre la tête. Par exemple si l'on souhaite effectuer une tâche dans un thread (de façon asynchrone), il suffit juste :
* d'écrire la fonction,
* d'utiliser QtConcurrent::run(),
Maintenant, si l'on souhaite récupérer le résultat, deux façons de faire :
* avec QFuture : waitForFinished() ou result(), permet de synchroniser
* avec QFutureWatcher : un signal est émis à la fin de la tâche
Mais l'intérêt majeur, ce sont les fonctions map, mapped, mappedReduce (et filter...), qui permettent d'appliquer une tâche à une collection d'éléments de manière asynchrone, en utilisant le plus de threads possible, le tout ne nécessitant guère plus de 3-4 lignes.
Pour prendre un exemple, la lecture d'un ensemble d'images (pour un visualisateur d'images par exemple) nécessitent :
* écriture d'une fonction renvoyant un QImage à partir de son nom/chemin : QImage load( const QString& name );
* la création d'une liste avec le nom de toutes les images : QList imageName
* l'appel à mapped : QList image = mapped( imageName, load );
[^] # Re: Précision/Question
Posté par Nicolas . En réponse au journal Qt 4.4 : Version de démonstration. Évalué à 2.
QtConcurrent permet d'utiliser autant de threads qu'il y a de coeur disponible sur la machine (utilisation d'une file d'attente s'il n'y a pas de coeur disponible).
L'intérêt, c'est surtout de ne pas se prendre la tête. Par exemple si l'on souhaite effectuer une tâche dans un thread (de façon asynchrone), il suffit juste :
* d'écrire la fonction,
* d'utiliser QtConcurrent::run(),
Maintenant, si l'on souhaite récupérer le résultat, deux façons de faire :
* avec QFuture : waitForFinished() ou result(), permet de synchroniser
* avec QFutureWatcher : un signal est émis à la fin de la tâche
Mais l'intérêt majeur, ce sont les fonctions map, mapped, mappedReduce (et filter...), qui permettent d'appliquer une tâche à une collection d'éléments de manière asynchrone, en utilisant le plus de threads possible, le tout ne nécessitant guère plus de 3-4 lignes.
Pour prendre un exemple, la lecture d'un ensemble d'images (pour un visualisateur d'images par exemple) nécessitent :
* écriture d'une fonction renvoyant un QImage à partir de son nom/chemin : QImage load( const QString& name );
* la création d'une liste avec le nom de toutes les images : QList imageName
* l'appel à mapped : QList image = mapped( imageName, load );
Et voilà, c'est magique !