timer selon retour event

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

timer selon retour event

Message par jmg49 »

Bonjour,

je rencontre un problème (ou pas) de fonctionnement avec les timer, dans le code suivant,

concernant mes deux premiers boutons check , j'ai en commentaire les lignes qui me servent à tester si coché ou pas , cela fonctionne

La procédure "Lancer" est censée récupérer l'état des deux boutons et appliquer le timer qui va bien , après 5 ou 10 secondes, l'application ne se ferme pas

de plus, quand je la ferme par la croix , j'ai le messagerequester du label end1: qui s'affiche .....

Code : Tout sélectionner


; prg Control 
; PB 5.30
;
            
;      _ __  __  _____         ___   ___  __ _  _   
;     | |  \/  |/ ____|  ____ |__ \ / _ \/_ | || |  
;     | | \  / | |  __  / __ \   ) | | | || | || |_ 
; _   | | |\/| | | |_ |/ / _` | / /| | | || |__   _|
;| |__| | |  | | |__| | | (_| |/ /_| |_| || |  | |  
; \____/|_|  |_|\_____|\ \__,_|____|\___/ |_|  |_|  
;                      \____/                      
;                                                   
                                                  




#NbProcessesMax=10000
Global Dim ProcessesArray.l(#NbProcessesMax)





Enumeration Fenetres
  #Fenetre1
EndEnumeration

Enumeration Gadgets
  #Titre
  #Bouton1
  #Bouton2
  #Edit1
  #Txt1
  #Txt2
  #Txt3
  #Check1
  #Check2
  #Check3
  #Check4
  
EndEnumeration


Declare ClicBouton1()
Declare ClicBouton2()
Declare GetProcessList()
Declare Lancer()


OpenWindow(#Fenetre1, 0, 0, 800, 600, "Gestion du temps PC / Enfants ", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(#Titre, 320,10,140,20, "Controleur Utilisation PC ")
TextGadget(#Txt1, 20,80,240,20,"Temps d'utilisation souhaitée")
TextGadget(#Txt2, 20,300,240,20,"Message d'avertissement ")
TextGadget(#Txt3, 20, 400,240,20, "Afficher le message ")
ButtonGadget(#Bouton1, 290, 320, 70, 20, "Valider")
ButtonGadget(#Bouton2, 700, 480, 70, 20, "Lancer")
EditorGadget(#Edit1, 20, 320, 240, 20)
CheckBoxGadget(#Check1, 20,110 ,240,20, "  1 H ")
CheckBoxGadget(#Check2, 20,140 ,240,20, "  2 H ")
CheckBoxGadget(#Check3, 20,450 ,240,20, " 10 Minutes avant la fin prévue ")
CheckBoxGadget(#Check4, 20,480 ,240,20, "  5  Minutes avant la fin prévue ")


 ;SetTimer_(WindowID(#Fenetre1),0,5000,?end1)  ; test timer 

;Gestion événements 

; clic boutons
BindGadgetEvent(#Bouton1,@ClicBouton1())
BindGadgetEvent(#Bouton2,@ClicBouton2())




; check boutons




Repeat 
  
  Event = WaitWindowEvent(10)
  
  
      Select EventGadget()
  
        Case  Check1 
          
          state= GetGadgetState(#Check1)
          
          
          
; test coché ou pas          
          
          
          ;If state = #PB_Checkbox_Checked ; 1 H
          
           ;MessageRequester("check1", "coché ") 
           ;Goto zeend 
            
          
          
        ;EndIf
        
          
      EndSelect
      
      
      
      Select EventGadget()
          
        Case  Check2 
          
           state2= GetGadgetState(#Check2)
          
           
; test coché ou pas 
           
           
           ;If state2 = #PB_Checkbox_Checked
          
            ;MessageRequester("check2", "coché ") 
            ;Goto zeend 
           
          
          
        ;EndIf
        
          
      EndSelect
      
  
  
  
       Select EventGadget()
          
        Case  Check3 
          
          state3= GetGadgetState(#Check3)
          
          If state3 = #PB_Checkbox_Checked
          
            MessageRequester("check", "coché ") 
            Goto zeend 
          
          
        EndIf
        
          
      EndSelect  
  
      
      
      
      Select EventGadget()
          
        Case  Check4 
          
          state4= GetGadgetState(#Check4)
          
          If state4 = #PB_Checkbox_Checked
          
            MessageRequester("check4", "coché ") 
            Goto zeend 
          
          
        EndIf
        
          
      EndSelect
      
      
      
  
  
 Until Event = #PB_Event_CloseWindow




Procedure ClicBouton1()
   
  message$ = GetGadgetItemText(#Edit1,0)
  
  
  MessageRequester("advert", message$) 
  
  End
  
  
  
EndProcedure


Procedure ClicBouton2()
  
  GetProcessList()
  Lancer()
  
  
EndProcedure

  

Procedure Lancer()
  
  
  
   If state = #PB_Checkbox_Checked 
     
         
   SetTimer_(WindowID(#Fenetre1),0,5000,?end1)
  
EndIf


  If state2 = #PB_Checkbox_Checked

  SetTimer_(WindowID(#Fenetre1),0,10000,?end2)
  
EndIf
  
  
  
EndProcedure





; procedure touvée sur forum 

Procedure GetProcessList()
  If OpenLibrary(0, "psapi.dll")
    EnumProcesses = GetFunction(0, "EnumProcesses")
    EnumProcessModules = GetFunction(0, "EnumProcessModules")
    GetModuleBaseName = GetFunction(0, "GetModuleBaseNameA")
    CallFunctionFast(EnumProcesses, ProcessesArray(), #NbProcessesMax, @nProcesses)
    For k = 0 To nProcesses >> 2
      hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, #False, ProcessesArray(k))
      If hProcess
        CallFunctionFast(EnumProcessModules, hProcess, @BaseModule, 4, @cbNeeded)
        Prozess$ = Space(cbNeeded)
        CallFunctionFast(GetModuleBaseName, hProcess, BaseModule, @Prozess$, cbNeeded)
        If Len(Prozess$) <> 0               ;z.B. System
          ;AddGadgetItem(Gadget, -1, Prozess$ + Chr(10) + Str(ProcessesArray(k)))
          processout$= Prozess$ + " " + Str(ProcessesArray(k))
          Debug processout$
         ; AddGadgetItem(#Lstview1, 0 ,processout$)
        EndIf
        CloseHandle_(hProcess)
      EndIf
    Next
    CloseLibrary(0)
  EndIf
EndProcedure


end1:

MessageRequester("end1", "Timer end1 terminé..")
End


end2:

MessageRequester("end2", "Timer end2 terminé..")
End

zeend:
End


Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: timer selon retour event

Message par falsam »

Utilises plutôt les fonctions natives de Pure Basic (AddWindowTimer() , EventTimer() et RemoveWindowTimer()) pour gérer tes timers.

Exemple d'un timer qui s'active quand on clique sur le bouton Go : Au bout de 10 secondes, la fenêtre se ferme.

Code : Tout sélectionner

Enumeration
  #Timer
EndEnumeration

Enumeration Window
  #MainForm
EndEnumeration

Enumeration Gadget
  #Go
  #Time
EndEnumeration

Global DateTime

Declare TimerGo()
Declare TimerEvent()
Declare MainFormShow()
Declare MainFormClose()

;-
;-UT : Timer
Procedure TimerGo()
  Debug "Lancement du timer"
  DateTime = Date()
  AddWindowTimer(#MainForm, #Timer, 1000)
EndProcedure

Procedure TimerEvent()
  If Date() - DateTime <= 10
    SetGadgetText(#Time, FormatDate("%hh:%ii:%ss", Date()))
  Else
    MainFormClose()
  EndIf
  
EndProcedure

;-
;-UT : Windows
Procedure MainFormShow()
  OpenWindow(#MainForm, 0, 0, 300, 200, "lancer un timer", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  TextGadget(#Time, 117, 71, 100, 50, "00:00:00")
  ButtonGadget(#Go, 100, 168, 80, 22, "Go")
  
  BindGadgetEvent(#Go, @TimerGo())
  
  BindEvent(#PB_Event_Timer, @TimerEvent(), #MainForm, #Timer)
  BindEvent(#PB_Event_CloseWindow, @MainFormShow(), #MainForm)
    
  Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
EndProcedure

Procedure MainFormClose()
  Debug "fermeture fenetre"
  RemoveWindowTimer(#MainForm, #Timer)
  End
EndProcedure

;Start
MainFormShow()
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: timer selon retour event

Message par Ar-S »

+1 pour les fonctions natives.

Je me permets tout de même de souligner les erreurs
tout d'abord : "Que de goto et que de répétitions pour rien.

Dans ta boucle principale tu fais un

Code : Tout sélectionner

Select EventGadget()
        Case  Check1
Endselect

Select EventGadget()
        Case  Check2
Endselect

Select EventGadget()
        Case  Check3
Endselect

; etc...
Non :lol:

Un seul select te suffit.

Code : Tout sélectionner

Select EventGadget()
        Case  Check1

        Case  Check2

        Case  Check3
Endselect
Pour ton histoire de messagerequester quand tu quittes, c'est normal.
Revoilà ton code avec les procédures au dessus du code pour que tu comprennes ce qui se passe.

Code : Tout sélectionner



#NbProcessesMax=10000
Global Dim ProcessesArray.l(#NbProcessesMax)


Enumeration Fenetres
  #Fenetre1
EndEnumeration

Enumeration Gadgets
  #Titre
  #Bouton1
  #Bouton2
  #Edit1
  #Txt1
  #Txt2
  #Txt3
  #Check1
  #Check2
  #Check3
  #Check4
 
EndEnumeration


Declare ClicBouton1()
Declare ClicBouton2()
Declare GetProcessList()
Declare Lancer()


;********** PROCEDURES ****************


Procedure ClicBouton1()
   
  message$ = GetGadgetItemText(#Edit1,0)
 
 
  MessageRequester("advert", message$)
 
  End
 EndProcedure
; (......)

;********** PROGRAMME ****************

OpenWindow(#Fenetre1, 0, 0, 800, 600, "Gestion du temps PC / Enfants ", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(#Titre, 320,10,140,20, "Controleur Utilisation PC ")
TextGadget(#Txt1, 20,80,240,20,"Temps d'utilisation souhaitée")
TextGadget(#Txt2, 20,300,240,20,"Message d'avertissement ")
TextGadget(#Txt3, 20, 400,240,20, "Afficher le message ")
ButtonGadget(#Bouton1, 290, 320, 70, 20, "Valider")
ButtonGadget(#Bouton2, 700, 480, 70, 20, "Lancer")
EditorGadget(#Edit1, 20, 320, 240, 20)
CheckBoxGadget(#Check1, 20,110 ,240,20, "  1 H ")
CheckBoxGadget(#Check2, 20,140 ,240,20, "  2 H ")
CheckBoxGadget(#Check3, 20,450 ,240,20, " 10 Minutes avant la fin prévue ")
CheckBoxGadget(#Check4, 20,480 ,240,20, "  5  Minutes avant la fin prévue ")


;SetTimer_(WindowID(#Fenetre1),0,5000,?end1)  ; test timer

;Gestion événements

; clic boutons
BindGadgetEvent(#Bouton1,@ClicBouton1())
BindGadgetEvent(#Bouton2,@ClicBouton2())

GetProcessList()

; check boutons


;********** BOUCLE ****************

Repeat
 
  Event = WaitWindowEvent(10)
 
 
      Select EventGadget()
 
        Case  Check1
         
          state= GetGadgetState(#Check1)
         
         
         
; test coché ou pas         
         
         
          ;If state = #PB_Checkbox_Checked ; 1 H
         
           ;MessageRequester("check1", "coché ")
           ;Goto zeend
           
         
         
        ;EndIf
       
         
         
        Case  Check2
         
           state2= GetGadgetState(#Check2)
         
           
; test coché ou pas
           
           
           ;If state2 = #PB_Checkbox_Checked
         
            ;MessageRequester("check2", "coché ")
            ;Goto zeend
           
         
         
        ;EndIf
       
         
   
        Case  Check3
         
          state3= GetGadgetState(#Check3)
         
          If state3 = #PB_Checkbox_Checked
         
            MessageRequester("check", "coché ")
            Goto zeend
         
         
        EndIf
       
             
        Case  Check4
         
          state4= GetGadgetState(#Check4)
         
          If state4 = #PB_Checkbox_Checked
         
            MessageRequester("check4", "coché ")
            Goto zeend
         
         
        EndIf
       
         
      EndSelect
     
     
     
 
 
Until Event = #PB_Event_CloseWindow

; Du coup lorsque tu appuyes sur la croix, le  #PB_Event_CloseWindow se produit et tu sorts de ta boucle...
; Et qu'est-ce qui vient dessous ? ^^


end1:

MessageRequester("end1", "Timer end1 terminé..")
End

;(...)
En gros lorsque tu quittes ta boucle en pressant la croix, ton code déboule sur ce qu'il y a après, en l’occurrence ton messagerequester placé en end1:
Ces flag et messagerequester tout seules servent à rien.
~~~~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
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: timer selon retour event

Message par jmg49 »

ah oui c'est super plus clair comme ça , j'ai bien compris le fonctionnement de cette façon,

désolé pour les goto , vieille habitudes à changer .... :oops:

y'à plus qu'à continuer merci :lol:
Répondre