Bonjour,
Suite à une question précédente, je me permet de demander de nouveau votre aide car malgré de multiples tests et recherche (QThread et QtConcurrent/QFuture entre autres), je ne parviens pas à obtenir ce que je souhaite.
J'ai actuellement une méthode assez volumineuse qui compile des fichiers sources via l'appel d'un programme externe grâce à QProcess. Afin d'éviter de voir l'IHM freeze je l'ai placé dans une nouvelle classe héritant de QThread.
Je souhaitais donc avoir une QProgressDialog durant la période de compilation afin de montrer à l'utilisateur qu'il y avait toujours de l'activité. J'ai alors essayé plusieurs choses:
- Placer mon QProgressDialog dans la méthode run() de mon thread avec le processus de compilation => le QProgressDialog freeze durant le processus.
- Placer uniquement mon processus de compilation dans run() et lancer mon QProgressDialog avant de faire thread->start => fonctionne mais je ne sais pas comment récupérer le signal de fin de mon thread pour fermer mon QProgressDialog (initialisé à 0, 0).
- Lancer mon QProgressDialog dans un QtConcurrent => J'ai beau essayer différentes syntaxes je ne parviens pas à compiler le programme
- Lancer mon ma méthode de compilation dans un QtConcurrent => idem que pour le point précédent.
J'ai vraiment passé du temps a chercher sur le forum, dans les cours et sur d'autre sites, en essayant un peu à chaque fois. Cependant, je reste bloqué au même point.
Je pense que l'idéal et le moins contraignant serai d'utiliser QtConcurrent pour lancer mon QProgressDialog et laisser tourner le processus dans le programme principal. Une fois celui-ci terminé, je sors de ma condition et le QProgressDialog peut se fermer.
Peut être ai-je mal compris, en attente de réponses avisées pouvant m'éclairer sur un chemin à suivre. Je vais essayer en attendant cette dernière solution dont je parlais.
Edit: La piste sur laquelle je me penche actuellement (m'affiche une erreur pour QtConcurrent)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if(conditions) { ui->labelEtat->setText("Travail en cours... Cela peut prendre plusieures minutes, veuillez patienter..."); QFutureWatcher<int> watcher; watcher.setFuture(QtConcurrent::run(this, &DialogGenInstaller::generateInnoFile); connect(&watcher,SIGNAL(finished ()),&progress ,SLOT(close ())); progress.exec(); }
Partager