Mettre en pause l'execution du programme

Résolu
dan93190 Messages postés 33 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 19 août 2008 - 19 août 2008 à 09:31
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011 - 19 août 2008 à 22:17
Slt à tous, j'ai une petite question, si vous pouviez cela m'arrangerait.

Mon appli parcours plusieurs dossiers contenant des fichiers Word et fait certains traitement dessus.
Etant donné que le nombre de fichier avoisine la centaine, le temps d'exécution approche la dizaine de minute.

Le problème est que pendant ce temps là, l'utilisateur ne peut rien faire (cliquer sur un bouton,réduire la fenêtre,...) puisque le prog est dans les boucles FOR qui me permettent de me balader dans les fichiers.

Comment rendre possible la mise en pause de l'exécution pour que l'utilisateur puisse faire autre chose et que par la suite il reprenne l'exécution ??

Merci pour votre aide (Si je ne suis pas clair, je peux me re-expliquer)

3 réponses

TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
19 août 2008 à 09:59
La premiere chose qu'il serait bien de faire serait tout d'abord de créé un formulaire a cet effet avec dessus un label, une progress barre, une list view a la rigueur
avec une icone qui specifie
"En attente", "En traitement", "Traité", "Erreur de traitement" etc ... histoire d'avoir au moins un minimum d'infos sur ce que fait le programme
de mon coté je ne pourrais pas supporté qu'un programme tourne comme un dingue 10 minutes a faires des calcul ou autres sans avoir la moindre idée de l"avancement ni même de ce qu'il fait

Apres pour ton problème principal,
Commencons par les base de la programmation sous windows :
quand tu créé une fenetre que tu le veuille ou non et que ca sois visible ou non il existe quelque part une fonction appele en general "WndProc" qui est une fonction que Windows va appelé lors que certain evenement se produise tel que part exemple WM_PAINT qui va indiquer a la fenetre qu'elle doit se redessiner ou simplement une partie de la fenetre. ( En general un event "Paint").
Cette fonction appelle elle meme en general : DefWindowProc() qui effectue un traitement par default pour ces evenement (a moins que tu personnaliser le traitement)

cela dit cette fonction est executé sur un thread bien particulier : Celui de ton formulaire.
Le probleme ici c'est que le thread de ton formulaire est occupé par ta boucle (chose bien horrible en soit) et celui ci ne peut donc plus aller lire les evenement que windows lui passe, ni meme appeller "DefWindowProc()", il n'y a doc aucune gestion des evenement par default, donc la fenetre ne reagit plus au clic, ne se redessine plus etc ... un freeze complet (totalement NORMAL)

Pour eviter cela la methode est relativement simple et peut etre regler de 2 methodes :

Methode 1 :
A evité dans ton cas :
rajouté la ligne
App.DoEvent 'vb6
Application.DoEvents() 'vb.net
a chaque debut ou fin de boucle, cette ligne force la fenetre a executé cette gestion par default des evenement  non traité dans la WndProc

Methode 2 :
Créé un nouveau formulaire qui va s'occuper de rendre un veritable affichage et rendu en temps reel de l'avancement des operation
créé un thread de background (avec pouruqoi pas une basse priorité) et placer ta boucle de calcul dans ce thread
comme celui ton formulaire n'as pas le meme thread que le calcul et la WndProc peut effectuer ses traitement comme il se doit sans avoir recours a App.DoEvent
de plus ca te permettrais de pouvoir mettre en pause le thread pour arreter temporairement les operation, les reprendre ou "aborté" l'operation.
reste avec quelque variables simple de synchroniser l'avancement reel dans la boucle avec l'affichage et le tour est joué

.net est un enorme avantage a ce niveau car la creation de thread est intuitive dedans, de plus vb6 n'est plus compatible avec tous les OS tel que Vista x64, est reconnu comme obsolete par microsft et a été remplacer il y a plus de 6 ans, il serait temps de penser a se mettre a jour pour avoir un support d'aide adequat pour la suite

bonne journée,
TeBeCo
3
dan93190 Messages postés 33 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 19 août 2008
19 août 2008 à 10:19
Merci beaucoup pour ta réponse plus qu'exhaustive !!!

J'avais oublié de le mentionner tout à l'heure, mais j'ai bien sur mis une progressbar et un label pour décrire l'état davancement du parcours des dossiers et une autre progressbar et un autre label pour l'état d'avancement dans chaque fichier.

Pour ce qui est du VB6, je suis tout à fait d'accord avec toi, seulement je n'ai pas le choix:
Je suis en stage et ils ne m'ont donné accès qu'à VB6 (Problème de licence je suppose).

Enfin,je tiens à dire que je ne pouvais attendre meilleur explication du fonctionnement d'un formulaire et des threads: simple, efficace et accessible à un débutant comme moi .
 
Donc si j'ai bien compris, je dois avoir 2 formulaires:
 - Un qui s'occupe de travailler sur les fichiers et qui envoi les résultats à l'autre formuaire. Donc ce formulaire travaille à fond (avec ses boucles for).
 - L'autre qui s'occupe d'afficher les résultats (reçu par le premier formulaire) et qui peut stopper le traitement à tout moment.

C'est ça ou est-ce que je me plante ?

Et je n'ai juste pas compris l'histoire de créer un thread en backgroung avec priorité basse !!

Merci
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
19 août 2008 à 22:17
Donc si j'ai bien compris, je dois avoir 2 formulaires:
 - Un qui
s'occupe de travailler sur les fichiers et qui envoi les résultats à
l'autre formulaire. Donc ce formulaire travaille à fond (avec ses
boucles for). <=== sur un thread ça
 - L'autre qui s'occupe d'afficher les résultats (reçu
par le premier formulaire) et qui peut stopper le traitement à tout
moment.
<=== ce form se synchronise avec le thread

un thread c'est pas forcement lié a un formulaire a partir de la tu le mets ou bon te semble mais bon faut essayé de bien le mettre pour libérer les ressources a la fin donc je suppose que la déclaration de variable se fait dans le form qui presente l'avancement comme ca les 2 sont detruit enssemble au dispose() / = null;

TeBeCo
0
Rejoignez-nous