Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

progress bar est-ce la bonne méthode ?

2 réponses
Avatar
Roger
Bonjour,
J'ai voulu rajouter une barre de progression pour voir l'avancement d'un
traitement de gros fichiers, j'ai procédé de la manière suivante qui
fonctionne, mais est-ce bien la manière la plus élégante ?
J'ai mis ma barre de progression dans un dialogue du fichier ressource.
Mon programme principal prépare tous les éléments pour le traitement de
fichier, puis lance dans l'ordre:
- 2 threads
- et le DialogBox de la barre de progression

Le 1er thread effectue le traitement de fichier
Le 2ème thread surveille l'avancement du traitement de fichier (nombre de
blocs écrits) et poste des messages (WM_NOTIFY) à la boîte de dialogue tous
les n blocs et poste un message (WM_NOTIFY) spécifique quand le traitement
est fini.
La boîte de dialogue récupère la main dans WM_NOTIFY et fait avancer le
contrôle barre en fonction du pourcentage de blocs écrits ou sort par un
EndDialog si c'est fini.

Sans synchronisation ça ne marche pas car les threads démarrent avant que la
boîte de dialogue soit créee, j'ai donc dû rajouter une boucle Sleep(0) sur
un booléen au début de chaque thread.
C'est le process du DialogBox dans son WM_INITDIALOG qui juste avant le
break débloque le booléen.

Et ainsi ça marche correctement, mais est-ce élégant et est-ce la méthode
préconisée ?
Merci

2 réponses

Avatar
Jeremy
"Roger" a écrit dans le message de news:
50d83820$0$1176$
Bonjour,
J'ai voulu rajouter une barre de progression pour voir l'avancement d'un
traitement de gros fichiers, j'ai procédé de la manière suivante qui
fonctionne, mais est-ce bien la manière la plus élégante ?



Sans doute.
on trouve des petits exemples sur le net comme
http://nicolozilio.wordpress.com/2011/01/09/creating-a-thread-in-a-win32-application/
Avatar
Roger

Sans doute.
on trouve des petits exemples sur le net comme
http://nicolozilio.wordpress.com/2011/01/09/creating-a-thread-in-a-win32-application/


Merci,
En fait j'ai remplacé mes boucles Sleep(0) sur un booléen pour la synchro au
démarrage par un WaitForSingleObject(hEvent,INFINITE) dans chaque thread sur
un évènement (hEvent) que j'avais créé dans le programme principal c'est
plus standard et ça prend moins d'UC. J'ai dû rajouter aussi dans le
programme principal un WaitForMultipleObjects(2,keythread,TRUE,INFINITE) en
fin de traitement car sinon il y avait des cas où le programme principal se
terminait avant que le thread qui effectuait le traitement ait complètement
terminé, ce qui fait que le thread était tué et le traitement pas
complètement fini !
Thanks