[RESOLU] Rien ne s'affiche pendant la copie...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] Rien ne s'affiche pendant la copie...

Message par omega »

Bonsoir à tous

J'ai un dossier Dos1 qui contient plusieurs sous-dossiers. Je voulais copier Dos+contenu dans un dossier nouveau (vide) qui existe. Je voudrais, après la fin de copie de chaque sous-dossier, afficher le nom du dossier copié sur mon listIconGadget.
Je n'ai pas le code complet sous la main mais je vais reproduire la partie qui ne marche pas:

Code : Tout sélectionner

Source$="f:\" :  Dest$="e:\"
SetGadgetState(#ProgBar,1); -------  progresseBar...
Wpas=1
If ExamineDirectory(0, source$, "") 
   While NextDirectoryEntry(0)
           Dossier$=DirectoryEntryName(0)
           CopyDirectory(wSource$+dossier$,wdest$+dossier$,"",#PB_FileSystem_Recursive | #PB_FileSystem_Force)
           addGadgetItem(#Grid,-1,dossier$ + space(1)+"copié"); ----------- ListIconGadget ...
           wpas=1+wpas+random(4)           
           SetGadgetState(#ProgBar,wpas)
   Wend
   FinishDirectory(0)   
EndIf
La copie se fait normalement mais rien ne s'affiche sur la ListIconGadget (#grid), en tout cas pas durant la copie. L'affichage se fait à la fin du traitement. J'ai essayé le debug à la place du grid, ça marche, j'ai essayé aussi un textgadget, ça marche aussi, mais sur ma ListIconGadget ça ne marche pas. Le progressBar non plus ne change pas malgré qu'il s'incrémente juste après chaque copie de dossier.

Merci
Dernière modification par omega le lun. 15/févr./2016 21:29, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Rien ne s'affiche pendant la copie...

Message par falsam »

Bonjour Omega,
omega a écrit :La copie se fait normalement mais rien ne s'affiche sur la ListIconGadget
C'est normal. Durant la lecture de ton dossier, la fenetre n'a plus la main et par conséquence il n'y a pas de mise à jour.

Il faut threader ton traitement de lecture/ecriture.

Les threads permettent à un programme d'effectuer plusieurs opérations en même temps (Presque en même temps). Cela devient utile lorsque celui-ci doit effectuer une tâche relativement longue et que vous voulez tout de même permettre à l'utilisateur d'agir sur le programme.


Tu as un exemple sur ce lien : http://www.purebasic.fr/french/viewtopi ... 17#p130717
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Rien ne s'affiche pendant la copie...

Message par Ar-S »

Note : pour le code de ce topique (et pour gérer les thread en général), pense à cocher "activer la gestion des threads" dans les options de compilation.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Rien ne s'affiche pendant la copie...

Message par Marc56 »

omega a écrit :La copie se fait normalement mais rien ne s'affiche sur la ListIconGadget (#grid), en tout cas pas durant la copie. L'affichage se fait à la fin du traitement.
Le rafraichissement des gadgets en PB ne se fait que lorsque le programme passe sur l'attente d'évènement :!: WindowEvent() ou WaitWindowEvent()

Il existe une API pour rafraichir un gadget, mais il y a encore plus simple, il suffit d'effectuer une boucle "à vide" avec une itération (une seule suffit). Il n'y a aucun temps d'attente.
Si tu ne veux pas faire de thread, il suffit juste d'ajouter cette ligne:
:idea: While WindowEvent() : Wend

Code : Tout sélectionner

   While NextDirectoryEntry(0)
           ...     
           SetGadgetState(#ProgBar,wpas)
           While WindowEvent(): Wend
   Wend
:)

PS. Cela fonctionne parfaitement sauf si tu appelles ta procédure par BindEvent()
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Rien ne s'affiche pendant la copie...

Message par JohnJohnsonSHERMAN »

Bonjour omega
Ah là, je suis en terrain connu... je viens d´avoir le meme probléme pour une bibliothéque de musique qui scanne un répertoire et se sous répertoires. Perso ce que je te conseille, c´est un thread (comme cela a déja été dit plus haut), l´avantage du thread c´est que, tournant en "parraléle", l´utilisateur peut continuer a interagir avec le programme quasi normalement (pense juste a désactiver le ou les éventuels gadgets qui lancent la copie, pour éviter que l´on clique dessus alors que le thread tourne encore), ca peut etre trés utile de pouvoir interagir quand meme pendant des temps de traitements qui peuvent etre trés longs (pour moi, scanner tout mon disque D: me demanderait sans doute une ou deux heures).
Le défaut que tu *pourrait* avoir, c´est un scintillement de ta liste (je ne sait pas si c´est du a mon code ou juste a l´utilisation du thread, mais j´ai ce petit probléme, le mieux serait que tu teste et tu nous tient au courant ;) )
Aprés si t´as pas envie de faire un thread, le WindowEvent() est satisfaisant, seulement l´utilisateur ne pourra plus cliquer partout, a moins que tu ne copies toute ta boucle d´événements dans le while Windowevent().
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Rien ne s'affiche pendant la copie...

Message par Anonyme2 »

Ar-S a écrit :Note : pour le code de ce topique (et pour gérer les thread en général), pense à cocher "activer la gestion des threads" dans les options de compilation.
JohnJohnsonSHERMAN a écrit :Bonjour omega
Ah là, je suis en terrain connu... je viens d´avoir le meme probléme pour une bibliothéque de musique qui scanne un répertoire et se sous répertoires. Perso ce que je te conseille, c´est un thread (comme cela a déja été dit plus haut),...
J'ai rien contre les threads, je les utilise de temps en temps.

pense à cocher "activer la gestion des threads" ne suffit pas toujours, si on tente de lire/d'écrire des variables en même temps depuis un ou des thread voire le code normal (avec des threads), on aura des crash puisque le/les threads sont asynchrones. Il faut regarder si les threads lisent/écrivent des variables partagées, quelles soient déclarées (global etc.) ou non, c'est le cas des fonction PB par exemple si on lit/écrit une chaine d'un gadget ou d'API, fichiers etc.. Si c'est le cas on doit protéger l'accès avec un mutex, voire la doc PB.

Ne pas utiliser DirectX dans un Thread (voir la doc).

Il est parfois nécessaire de synchroniser les threads sinon le résultat ne correspondra pas à la réalité, on utilise alors un sémaphore, voire la commande PB CreateSemaphore() et l'exemple (accès aux éléments d'une liste chainée) qui explique bien le sujet.
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Rien ne s'affiche pendant la copie...

Message par JohnJohnsonSHERMAN »

D´une maniére générale la doc de pb sur les thread est assez bien faite a mon gout, et facile a comprendre... D´aprés ce que tu envisages de faire, tu n´aura pas besoin de faire plusieurs threads, est don d´utiliser des mutex ou des sémaphores, mais jettes-y un oeil quand meme c´est assez instructif.

Ce que tu peux faire aussi c´est utiliser PostEvent() au début et a la fin de ton thread pour envoyer un événement perso a la boucle principale, par exemple pour afficher une barre de progression, et désactiver d´éventuels gadgets qui feraient reprendre le thread alors qu´il ne s´est pas encore fini, ect... et ls réactiver a la fin. Je trouve PostEvent trés utile pour suivre le déroulement du thread a partir du programme principal, ca apporte toujours un petit plus de renseigner l´utilisateur sur l´état du programme, ca fait "pro"

Allez bon courage a toi !
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Rien ne s'affiche pendant la copie...

Message par omega »

L'activation de la gestion des threads a en effet solutionné mon problème. Merci à tous.
Win7 (x64) 64 bits Pb 5.72
Répondre