Affichage dans une listBox en C++/CLI

molo2003
Affichage dans une listBox en C++/CLI

Bonjour les experts;

Je suis sous XP Ed Fam. et je développe un petit utilitaire de sauvegarde avec Microsoft Studio 2005 C++ (Framework 2.)...

Globalement, dans le répertoire de sauvegarde, je vérifie l'existence des fichiers, la date de dernière ecriture des fichiers avant de les copier... en comparaison avec ceux du répertoire origine ... et cela marche trés bien ....
A part que, je veux (pour l'utilisateur) afficher en direct le suivi des opérations de création de répertoires, copie et suppression de fichiers dans une listBox... au moyen d'une ligne par action.
Exemple: (ma Name.listBox est list_oper)...
dans mon code on trouve:
list_oper->Items->Add(" Copie du fichier ....... Patientez.");
list_oper->Items->Add("Création du répertoire \"famille\" dans ....");
...
Mon problème est que l'affichage de toutes ces opérations se fait d'un bloc en fin de sauvegarde. Alors que moi, je souhaiterai que chaque ligne (chaque action) s'affiche en direct pour que l'utilisateur puisse suivre le déroulement de la sauvegarde, qui peut durer 5 minutes. Actuellement , durant l'operation , la listBox apparait toute vide ... seul le curseur vertical diminue, indiquant l'enregistrement des actions mais sans affichageau fil de l'eau.

Existe t -il un buffer d'affichage que l'on peut vider pour actualiser l'affichage ??? je suppose!!! Identique au buffer d'ecriture d'un fichier que l'on vide à dessein par la fonction flush().

Je suis un développer amateur.

Grand merci de votre aide par avance.

fredericmazue

Quote:
Existe t -il un buffer d'affichage que l'on peut vider pour actualiser l'affichage ??? je suppose!!! Identique au buffer d'ecriture d'un fichier que l'on vide à dessein par la fonction flush().

Non rien à voir. Le problème est que les opérations de sauvegarde sont faites, à l'insu de ton plein gré, dans le même thread que celui s'occupe de rafraîchir l'affichage et il y a embouteillage.
Tu dois donc restructurer ton code

1) toute la sauvegarde tu dois la faire dans un thread séparé
2) depuis ce thread, tu écris chaque étape dans la ListBox, mais attention tu ne peux pas faire directement lalistbox.Items.Add(...
Ca marchera mal ou même plantera. Mais rien ne t'empêche d'essayer quand même:)
Ce qu'il faut faire est appeler la méthode lalistbox.Invoke et ce qu'on invoque par ce moyen est un délégué qui enveloppe lalistbox.Item.Add.
Moyennant quoi ça marchera. Parce que ce faisant le rafraîchissement de l'affichage se fera dans son propre thread qui n'est plus squeezé par ton opération de sauvegarde puisque celle-ci est placée dans un thread séparé.
Mais pour invoquer sainement depuis un thread une méthode de composant, il faut le faire par le biais de composant.Invoke.

Heu oui, avec un bout de code ça sera plus faicle et clair... Mais je n'ai pas le temps. :oops: Peut être qu'une bonne âme aura le temps et la gentillesse de t'écrire un bout de code en exemple pour compléter mes nébuleuses explications

molo2003

Grand merci a toi, Fredericmazue;

Mais tu sais , les threads sont un gros morceau pour moi .... aussi avant de m'y atteler faut que je prenne des vacances bien méritées.

Oui, sérieusement, je vais délaisser un peu le développement au profit de ballades en altitude , tout prés de la nature....

Encore merci a toi;
A++++++ dans quelques jours ...

fredericmazue

Quote:
Mais tu sais , les threads sont un gros morceau pour moi

Mais en .Net c'est plutôt facile à manier. Tu verras après tes vacances :)

Quote:
Oui, sérieusement, je vais délaisser un peu le développement au profit de ballades en altitude , tout prés de la nature....

:)
Toutes choses beaucoup plus importantes que l'informatique.
Oui sérieusement... :)

Bonnes vacances :)