Page 1 sur 1

pb affichage textgadget sous windows 10

Publié : mer. 29/juin/2016 10:20
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.

Re: pb affichage textgadget sous windows 10

Publié : mer. 29/juin/2016 14:54
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 ?

Re: pb affichage textgadget sous windows 10

Publié : mer. 29/juin/2016 16:05
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

Re: pb affichage textgadget sous windows 10

Publié : mer. 29/juin/2016 16:27
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:

Re: pb affichage textgadget sous windows 10

Publié : mer. 29/juin/2016 17:07
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.

Re: pb affichage textgadget sous windows 10

Publié : mer. 29/juin/2016 17:24
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:

Re: pb affichage textgadget sous windows 10

Publié : mer. 29/juin/2016 17:29
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

Re: pb affichage textgadget sous windows 10

Publié : mer. 29/juin/2016 17:34
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.

Re: pb affichage textgadget sous windows 10

Publié : mer. 29/juin/2016 19:41
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.