pb affichage textgadget sous windows 10

Codes specifiques à Windows
translucidus
Messages : 12
Inscription : mar. 01/juil./2014 9:28

pb affichage textgadget sous windows 10

Message par translucidus »

Bonjour à tous,

Je travaille habituellement sous Linux Debian, j'ai un programme qui télécharge des fichiers sur un serveur de la NOAA
aux US le textgadget affiche l'état par exemple 10/180.
Cela fonctionne très bien sous linux, par contre sous windows l'affichage est figé si l'on clic la souris mais le programme se déroule bien.
Si l'on viens à cliquer sur la fenêtre du prog BP cela affiche que le programme ne répond pas.
Je n'ai pas ces problèmes sous linux..........
Merci de votre aide.
Bonne journée.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: pb affichage textgadget sous windows 10

Message par Ar-S »

Bonjour translucidus,
On veut bien tenter d'apporter de l'aide mais on est pas devin non plus.
Sans code, ça va pas être facile ? Quelle version de PB utilises tu ?
~~~~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
translucidus
Messages : 12
Inscription : mar. 01/juil./2014 9:28

Re: pb affichage textgadget sous windows 10

Message par translucidus »

Bonjour Ar-S,

Voici quelques lignes qui montre le PB si l'on clique avec la souris sur le bureau l'affichage se fige, ce
qui n'est pas le cas sous linux.

Code : Tout sélectionner

;Test affichage Textgadget dans une boucle
; 29/06/2016 DM
Define.w i , Nbt
#WindowWidth  = 350
#WindowHeight =180
If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight," TELECHARGEMENT GFS  NOAA " ,0)
  TextGadget(1, 70, 50,  220, 40, " Acquisition en cours :",#PB_Text_Border|#PB_Text_Center)         
  TextGadget(4, 80, 130,  200, 30, "CETTE FENETRE ",#PB_Text_Center)
  SetGadgetColor(4, #PB_Gadget_FrontColor, $FF00FF) 
  TextGadget(5, 80, 150,  200, 30, "SE FERMERA A LA FIN DU TRAVAIL !!!",#PB_Text_Center)
  SetGadgetColor(5, #PB_Gadget_FrontColor, $FF0000) 
  If LoadImage(0,"C:/METEO/Ballon/Data/ballon2.png") 
    ButtonImageGadget(7, 0, 0, 70, 67, ImageID(0))
  EndIf
  Nbt = 180
  StickyWindow(0, #True)
  For i= 0 To nbt Step 3
    Afnb$=Str(i)+"/"+Str(Nbt)
    SetGadgetText(1, " Acquisition en cours : "+Afnb$)
    Select i
      Case 0 To 9
        id$="00"+Str(i) 
        id2$="0"+Str(i)
      Case 10 To 99
        id$="0"+Str(i)
        id2$=Str(i)
      Case 100 To 200
        id$=Str(i)
        id2$=id$
    EndSelect
    Fichier$= Pth1$+"Gfs"+Hr2$+"_Europe.grb"
    ;urlok$=Chr(34)+"http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file=..................................
    cmd$="wget -nv -O "
    ;RunProgram (cmd$,Param$,"",#PB_Program_Wait|#PB_Program_Hide)
    Delay(500)
  Next i
EndIf
End
Merci
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: pb affichage textgadget sous windows 10

Message par Marc56 »

Bonjour translucidus,

Ton programme se fige car à aucun moment tu ne donne la main au gestionnaire d'évènement pour traiter ce que l'utilisateur peut entrer (ex: clic de souris). Du coup il sature le buffer et finit par planter.

Une rustine rapide consiste à mettre avant la ligne Delay(500) une ligne comme

Code : Tout sélectionner

While WaitWindowEvent() : Wend
Maintenant, idéalement il y aurait d'autres choses à mettre pour le rendre 'propre' c'est à dire qu'il puisse être interrompu par l'utilisateur (bouton stop, case de fermeture etc)
Delay n'est pas une instruction géniale dans une boucle avec beaucoup d'itérations, elle a vite fait de pomper du temps système.
Regarde aussi les fonctions LSet et Rset qui te permettent de formater facilement une chaine en complétant à droite et à gauche par un caractère au choix sans te préoccuper du nombre de caractères à utiliser.

Je viens de tester le code que tu as donné, sous Linux (Debian 8 avec xfce) et PB 5.42 LTS
Il n'affiche pas la progression (peut être que certaines libs me manquent) et plante aussi si on clique un certain nombre de fois
"Cette fenêtre ne répond pas : il se peut qu'elle soit occupée.
Voulez-vous fermer l'application ?"
Si on met le Delay à 50 au lieu de 500 il ne plante pas, mais c'est parce qu'il a fini avant de saturer le buffer souris

(dans les deux cas, j'avais désactivé le loadimage puisque n'ayant pas le fichier)

PS. Quand tu postes un code, sélectionne le bloc de texte puis cliques sur

Code : Tout sélectionner

 

 :wink:
translucidus
Messages : 12
Inscription : mar. 01/juil./2014 9:28

Re: pb affichage textgadget sous windows 10

Message par translucidus »

Merci Marc56 pour ta réponse rapide, dans mon programme je n'ai pas de Delay()
Je l'ai mis dans l' exemple pour que l'on puisse voir l'affichage.
Dans mon programme entre chaque boucle il y a environ 1 minute car les fichiers sont
Gros.
L'utilisateur ne doit surtout pas intervenir la fenêtre est là pour afficher l'avancement du
Téléchargement après l.acquisition mon programme fait beaucoup de calcul la fenêtre est close avant les calcul.
Tout cela marche parfaitement sous Debian8.3.
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: pb affichage textgadget sous windows 10

Message par Marc56 »

Ah, OK.

J'aurais tendance pour ce type de programme à utiliser un thread (autant s'en servir de nos jours puis qu'on a du multi-taches).
Faire tourner le traitement (chargement) en arrière plan et l'information (progression) au premier plan.
Ainsi tu n'auras aussi plus de sablier puisque la fenêtre d'info captera les évènements utilisateur.

Autre chose. Je vois que tu utilises wget. Tu pourrais utiliser avantageusement ReceiveHTTPFile() intégré à PB

:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: pb affichage textgadget sous windows 10

Message par Ar-S »

Je n'ai pas trop pigé ce que tu cherches à faire mais avec un timer ça peut être une solution pour l'incrémentation.

Code : Tout sélectionner

;Test affichage Textgadget dans une boucle
; 29/06/2016 DM
Define.w i , Nbt
#WindowWidth  = 350
#WindowHeight =180
If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight," TELECHARGEMENT GFS  NOAA " ,0)
  TextGadget(1, 70, 50,  220, 40, " Acquisition en cours :",#PB_Text_Border|#PB_Text_Center)         
  TextGadget(4, 80, 130,  200, 30, "CETTE FENETRE ",#PB_Text_Center)
  SetGadgetColor(4, #PB_Gadget_FrontColor, $FF00FF)
  TextGadget(5, 80, 150,  200, 30, "SE FERMERA A LA FIN DU TRAVAIL !!!",#PB_Text_Center)
  SetGadgetColor(5, #PB_Gadget_FrontColor, $FF0000)
  If LoadImage(0,"C:/METEO/Ballon/Data/ballon2.png")
    ButtonImageGadget(7, 0, 0, 70, 67, ImageID(0))
  EndIf
  Nbt = 180
  StickyWindow(0, #True)
  
  AddWindowTimer(0, 10, 500)
  
  
  Repeat
     Event = WaitWindowEvent()
     
     Select event
       Case #PB_Event_Timer
         
         Afnb$=Str(compte)+"/"+Str(Nbt)
         SetGadgetText(1, " Acquisition en cours : "+Afnb$)
         Select nbt
           Case 0 To 9
             id$="00"+Str(compte)
             id2$="0"+Str(compte)
           Case 10 To 99
             id$="0"+Str(compte)
             id2$=Str(compte)
           Case 100 To 200
             id$=Str(compte)
             id2$=id$
         EndSelect
         
         compte + 3
        
         
         Fichier$= Pth1$+"Gfs"+Hr2$+"_Europe.grb"
         ;urlok$=Chr(34)+"http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file=..................................
         cmd$="wget -nv -O "
         ;RunProgram (cmd$,Param$,"",#PB_Program_Wait|#PB_Program_Hide)
         
          If compte > 180
            RemoveWindowTimer(0, 10)  
            End
        EndIf
        
     EndSelect

   Until Event = #PB_Event_CloseWindow
   
   End
  
 EndIf
Je rejoints Marc56 pour l'utilisation d'un thread pour ce qui est du chargement en arrière plan. Sauf si tes fichiers sont très légers
~~~~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
Mesa
Messages : 1093
Inscription : mer. 14/sept./2011 16:59

Re: pb affichage textgadget sous windows 10

Message par Mesa »

Oui, le mieux, c'est d'utiliser un thread.
Il doit être possible de se passer d'un thread en utilisant un timer.

C'est un des rares exemples où on peut utiliser un "WindowEvent()" pour gérer les messages.
On peut utiliser "WaitWindowEvent(1)" la place de "WindowEvent()" mais il faut bien mettre un timer, ici j'ai mis 1ms sinon, la fenêtre ne se ferme qu'après un message windows, comme après avoir bouger la souris par exemple.

Code : Tout sélectionner

;Test affichage Textgadget dans une boucle
; 29/06/2016 DM
Define.w i , Nbt
#WindowWidth = 350
#WindowHeight =180

Global quit=0 ;<==================================== signal pour quitter

Procedure MaProcedureThread(*Valeur) ; <============== thread
  Nbt = 180
  
  For i= 0 To nbt Step 3
    Afnb$=Str(i)+"/"+Str(Nbt)
    SetGadgetText(1, " Acquisition en cours : "+Afnb$)
    Select i
      Case 0 To 9
        id$="00"+Str(i)
        id2$="0"+Str(i)
      Case 10 To 99
        id$="0"+Str(i)
        id2$=Str(i)
      Case 100 To 200
        id$=Str(i)
        id2$=id$
    EndSelect
    Fichier$= Pth1$+"Gfs"+Hr2$+"_Europe.grb"
    ;urlok$=Chr(34)+"http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file=..................................
    cmd$="wget -nv -O "
    ;RunProgram (cmd$,Param$,"",#PB_Program_Wait|#PB_Program_Hide)
    Delay(500)
  Next i; La variable '*Valeur' contiendra 23
  quit=1
EndProcedure


If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight," TELECHARGEMENT GFS NOAA " ,#PB_Window_Tool)
  SmartWindowRefresh(0, #True ) ; <========= pourquoi pas ;)
  
  
  TextGadget(1, 70, 50, 220, 40, " Acquisition en cours :",#PB_Text_Border|#PB_Text_Center)
  TextGadget(4, 80, 130, 200, 30, "CETTE FENETRE ",#PB_Text_Center)
  SetGadgetColor(4, #PB_Gadget_FrontColor, $FF00FF)
  TextGadget(5, 80, 150, 200, 30, "SE FERMERA A LA FIN DU TRAVAIL !!!",#PB_Text_Center)
  SetGadgetColor(5, #PB_Gadget_FrontColor, $FF0000)
  If LoadImage(0,"C:/METEO/Ballon/Data/ballon2.png")
    ButtonImageGadget(7, 0, 0, 70, 67, ImageID(0))
  EndIf
  StickyWindow(0, #True)
   
EndIf

monthread=CreateThread(@MaProcedureThread(), 0); <========== 

If quit=1; <========== 
  KillThread(monthread); <========== 
  CloseWindow(0); <========== 
EndIf; <========== 

Repeat 
  WindowEvent();WaitWindowEvent(1); <========== au choix
Until quit=1

End
Normalement, il faudrait activer l'option thread du compilateur, dans Compilateur\Option du compilateur, dans l'IDE. (bizarrement, ça marche sans...)

Mesa.
translucidus
Messages : 12
Inscription : mar. 01/juil./2014 9:28

Re: pb affichage textgadget sous windows 10

Message par translucidus »

Bonsoir,

Merci pour vos bons conseils, j'ai modifié ma programmation, avec un thread cela fonctionne bien.
J'ai l'habitude d'utiliser wget car je programme encore souvent en c et fortran qui est toujours utilisé dans
la programmation scientifique.

Bonne soirée à tous.
Répondre