Page 1 sur 1
[R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : ven. 18 janv. 2013 23:31
par EricF
Bonjour,
Je voudrais créer une GUI qui permet d'effectuer des actions de surveillance (ça, ça va), mais pouvoir arrêter et relancer la surveillance snas avoir à fermer l'application. J'ai essayé avec un while et la définition d'une variable, mais impossible d'activer le bouton.
Code : Tout sélectionner
While $actif = 1
If FileExists("test.txt") Then
$label = "Fichier test.txt présent"
GUICtrlSetColor($Label1, 0x00ff00)
Else
$label = "Fichier test.txt absent"
GUICtrlSetColor($Label1, 0xff0000)
EndIf
GUICtrlSetData($Label1, $label)
Sleep(2000)
WEnd
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
If $actif = 1 Then
GUICtrlSetData($Button1, "Démarrer")
$actif = 0
;~ MsgBox(0, "", "$actif est à " & $actif, 2)
Else
GUICtrlSetData($Button1, "Arrêter")
$actif = 1
;~ MsgBox(0, "", "$actif est à " & $actif, 2)
EndIf
EndSwitch
WEnd
Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : ven. 18 janv. 2013 23:42
par mikell
Essaie en mode onevent ça doit marcher
Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : ven. 18 janv. 2013 23:44
par Tlem
Au lieu de la première boucle, utilisez une fonction appelée par un AdlibRegister que vous activez ou pas.

Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : ven. 18 janv. 2013 23:51
par EricF
Plus comme ça ?
Code : Tout sélectionner
Func xxxxx()
If FileExists("test.txt") Then
$label = "Fichier test.txt présent"
GUICtrlSetColor($Label1, 0x00ff00)
Else
$label = "Fichier test.txt absent"
GUICtrlSetColor($Label1, 0xff0000)
EndIf
GUICtrlSetData($Label1, $label)
;~ Sleep(2000)
EndFunc
If $actif = 1 Then
AdlibRegister("xxxxx")
EndIf
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
If $actif = 1 Then
GUICtrlSetData($Button1, "Démarrer")
$actif = 0
;~ MsgBox(0, "", "$actif est à " & $actif, 2)
Else
GUICtrlSetData($Button1, "Arrêter")
$actif = 1
;~ MsgBox(0, "", "$actif est à " & $actif, 2)
EndIf
EndSwitch
WEnd
Ou une vérification de la valeur de $actif dans la fonction ?
Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : ven. 18 janv. 2013 23:56
par Tlem
Je le verrais plutôt comme ceci :
► Afficher le texte
Code : Tout sélectionner
Global $Actif = 0
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
If $Actif = 1 Then
GUICtrlSetData($Button1, "Démarrer")
$Actif = 0
AdlibUnRegister("xxxxx")
Else
GUICtrlSetData($Button1, "Arrêter")
$Actif = 1
AdlibRegister("xxxxx", 2000)
EndIf
EndSwitch
WEnd
Func xxxxx()
If FileExists("test.txt") Then
$label = "Fichier test.txt présent"
GUICtrlSetColor($Label1, 0x00ff00)
Else
$label = "Fichier test.txt absent"
GUICtrlSetColor($Label1, 0xff0000)
EndIf
GUICtrlSetData($Label1, $label)
EndFunc ;==>xxxxx
Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : sam. 19 janv. 2013 00:01
par EricF
ok, merci, je testerai
Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : sam. 19 janv. 2013 10:22
par mikell
Bah le onevent marche aussi ^^
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
Opt("GuiOnEventMode", 1)
GUICreate("My GUI", 100, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
$label = GUICtrlCreateLabel("", 40, 20, 30, 20)
GUICtrlSetBkColor(-1, 0xffffff)
$btn = GUICtrlCreateButton("start", 20, 50, 50, 20)
GUICtrlSetOnEvent(-1, "_stop")
GUISetState()
Global $stop = 1
While 1
If not $stop Then _surveille("test.txt")
Wend
;===================================
Func _surveille($file)
If FileExists($file) Then
GUICtrlSetBkColor($label, 0x00ff00)
Else
GUICtrlSetBkColor($label, 0xff0000)
EndIf
Sleep(1000)
If $stop Then Return
EndFunc
Func _stop()
$stop = not $stop
If not $stop Then GuiCtrlSetData($btn, "stop")
If $stop Then
GuiCtrlSetData($btn, "start")
GUICtrlSetBkColor($label, 0xffffff)
EndIf
EndFunc
Func _exit()
Exit
EndFunc
Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : sam. 19 janv. 2013 14:11
par Tlem
Certes, mais le code est moins évident à maitriser (au début) pour un novice.
(Perso je mettrais le Sleep plutôt dans la principale, sinon en cas d'appel de fonctions multiples ça va lagger ...).
Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : sam. 19 janv. 2013 18:23
par matwachich
Euh ... pourquoi faire simple quand on peut faire compliquer!
► Afficher le texte
Code : Tout sélectionner
Global $actif = 1
Global $__g_iTimer = TimerInit()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
If $actif = 1 Then
GUICtrlSetData($Button1, "Démarrer")
$actif = 0
Else
GUICtrlSetData($Button1, "Arrêter")
$actif = 1
EndIf
EndSwitch
; ---
_Verifier()
WEnd
Func _Verifier()
If Not $actif Or TimerDiff($__g_iTimer) < 2000 Then Return
$__g_iTimer = TimerInit()
; ---
If FileExists("test.txt") Then
$label = "Fichier test.txt présent"
GUICtrlSetColor($Label1, 0x00ff00)
Else
$label = "Fichier test.txt absent"
GUICtrlSetColor($Label1, 0xff0000)
EndIf
; ---
GUICtrlSetData($Label1, $label)
EndFunc
Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : sam. 19 janv. 2013 19:42
par mikell
C'est pas faux
Intéressant en tout cas, ça fait 3 méthodes différentes possibles
Re: [..] GUI de surveillance, avec bouton d'arrêt/relance
Posté : sam. 19 janv. 2013 19:51
par EricF
Merci, j'ai tout testé, je verrais ce que ça donne et le plus adapté.
Re: [R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : sam. 19 janv. 2013 22:28
par Tlem
Heuuu, en ce qui me concerne, je déconseille fortement la méthode de mat !
L'appel à une fonction dans la boucle principale n'est vraiment pas des plus recommandé.
Certes, pour le cas présent, pas de risque particulier, mais si le code doit évoluer, ce sera beaucoup moins évident. Et puis lancer une fonction qui vérifie si elle doit réellement être lancé ou non, me parait vraiment pas des plus logique (2 contrôles à chaque tours de boucle juste pour savoir si il faut ou non lancer la fonction ...

).
Re: [R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : sam. 19 janv. 2013 23:08
par matwachich
Bah c'est ce que je fais dans presque tous mes scripts, même les plus complexes: Je met même des fonctions complexes de réception TCP (_TCPServer_Process de mon UDF SimpleTCP) dans la boucle principale d'une grosse GUI, et ça ne pose aucun problème. J'aimerai bien quelques explications Tlem, merci!
En suite, j'aime mettre les timers dans leurs fonctions respectives par soucis d'organisation du code (ne pas surcharger la boucle principale quoi

), si ça ne plait pas, suffit de mettre la vérification du timer dans la boucle

Re: [R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : dim. 20 janv. 2013 00:03
par Tlem
Dans le cas présent, la boucle sert à récupérer les événements de la GUI, or si on rajoute des fonctions dans cette boucle, le temps pris par ces fonctions à de forte chance d'influer sur la détection de ces événements.
Dans l'exemple donné et comme je l'avais signalé, il est clair que la fonction
_Verifier() n'aura pas le temps d'influencer la boucle. Mais si on y rajoute des fonctionnalités (avant la première ligne) ou si on rajoute d'autres fonctions dans la boucle principale, alors il y a de fortes chances pour qu'un clic sur un bouton ne soit pas détecté parce qu'on était dans une fonction à ce moment là !
Le temps pris par toutes fonctions après le
EndSwitch risque d’empêcher que la ligne
$nMsg = GUIGetMsg() détecte l'événement graphique.
Si vous avez la nécessité de lancer des fonctions dans la boucle principale, alors,
vous devez passer en mode événementiel (ou utiliser
AdlibRegister).
matwachich a écrit :En suite, j'aime mettre les timers dans leurs fonctions respectives par soucis d'organisation du code (ne pas surcharger la boucle principale quoi

), si ça ne plait pas, suffit de mettre la vérification du timer dans la boucle

C'est assez paradoxal et implique une gymnastique assez spéciale, car en cas de fonctions multiples vous devrez utiliser autant de timer que de fonction !!! Je ne suis pas sure que ce soit optimal comme façon de coder. Ceci dit c'est votre choix et si vous en avez la maitrise, alors tant mieux. Mais ceci ne peut être une méthode généralisée car trop dépendante de tas de facteurs de risque d'erreur.
Re: [R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : dim. 20 janv. 2013 12:24
par mikell
Tlem a écrit :alors il y a de fortes chances pour qu'un clic sur un bouton ne soit pas détecté parce qu'on était dans une fonction à ce moment là !
Voilà très exactement pourquoi je préfère le mode évènementiel ...
http://www.autoitscript.com/wiki/Interr ... g_function
Même si dans ce cas précis (temps d'exécution très court de la fonction appelée) le AdlibRegister semble effectivement le plus adapté, de manière générale le problème reste le même (la fonction appelée est bloquante)
La solution idéale (?) pour un script plus complexe devrait probablement être un mix de AdlibRegister
et de mode évènementiel (ou de GuiRegisterMsg) avec flag d'interruption dans la fonction appelée
Quoique, timer + flag ça marcherait aussi, mais toujours avec du eventmode

Re: [R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : dim. 20 janv. 2013 12:31
par Tlem
Même si le mode événementiel est préférable dans la plupart des situations, il n'est pas le remède à tout les maux.
De plus, pour une interface graphique complexe, il implique un code généralement plus long (mais mieux structuré), sans compter la gestion des événement légèrement plus complexe.
Ceci dit, je te rejoint sur la qualité du code et les risques moins importants de défaut de gestion de la partie GUI.
Re: [R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : dim. 20 janv. 2013 18:17
par mikell
Tlem a écrit :Même si le mode événementiel est préférable dans la plupart des situations, il n'est pas le remède à tout les maux.

Hé, j'ai pas dit ça
Je dis pas qu'il faut mettre les boucles While à la poubelle, juste que le mode onevent est généralement préférable pour la réactivité du script
Pour mon script de countdown (
http://www.autoitscript.fr/forum/viewto ... f=6&t=9633 ) les 2 versions (GuiGetMsg et eventmode) fonctionnent, même si pour la réactivité il a fallu intégrer obligatoirement du GuiRegisterMsg (notamment pour imposer ces flags d'interruption de fonction évoqués plus haut)
Re: [R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : dim. 20 janv. 2013 23:46
par Tlem
mikell a écrit :Hé, j'ai pas dit ça

Hé, j'ai pas dit que tu l'avait dit ...

Re: [R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : lun. 21 janv. 2013 02:12
par mikell
Ah mais dis, c'est qu'on aurait presque dit que tu avais dit que je l'avais dit...
Bon ok, dans ce cas je ne dirai pas que tu as dit que je l'ai dit
Voilà c'est dit

Re: [R] GUI de surveillance, avec bouton d'arrêt/relance
Posté : lun. 21 janv. 2013 07:21
par Tlem
Ceci dit ....
Bon allez, il faut passer le balais hein !