Page 1 sur 1
[R] Boucle While et sortie de secours
Posté : mer. 15 oct. 2014 11:23
par antolionel74
Bonjour,
J'ai un problème un peu particulier.
Je souhaite faire un programme qui exécute une tache en boucle, en l’occurrence un "ping -t".
Jusque là pas de problème, mais je voudrais pouvoir stopper cette boucle pour retourner dans le programme principale.
Et c'est là que se pose le problème car je n'arrive pas a faire quelque chose de propre.
J'ai essayer de placer dans ma boucle infini une fonction :
Code : Tout sélectionner
Func event()
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
EndFunc
seulement ça ferme tout le programme et en plus ce n'est pas réactif, défois il faut cliquer plusieurs fois avant que ça ne réagisse.
L'idéale serait de pouvoir créer un genre de processus autonome que l'on pourrait facilement stopper dans le programme princiaple. Mais est-ce possible dans autoit.
peut être avez vous une autre méthode à me proposer ?
Re: [..] Boucle While et sortie de secours
Posté : mer. 15 oct. 2014 12:41
par orax
Pour éviter les blocages, tu peux utiliser le mode
OnEventMode. Et voir ProcessClose() pour fermer le ping.
Re: [..] Boucle While et sortie de secours
Posté : mer. 15 oct. 2014 13:55
par TommyDDR
antolionel74 a écrit :
seulement ça ferme tout le programme
Vous demandez de fermer le programme donc le programme est fermé, je ne vois pas le problème.
Sinon pour votre problème, je suis du même avis que orax, le mode évenementiel est tout aussi bien si ce n'est mieux et votre code sera beaucoup plus clair.
(Je n'utilise personnellement que ce mode dans tous mes scripts.)
Re: [..] Boucle While et sortie de secours
Posté : mer. 15 oct. 2014 14:54
par antolionel74
Il faut que je creuse votre méthode, mais je ne cerne encore pas bien la différence avec le mode "switch" de détection des événement d'une fenêtre.
Entre temps, j'avais fait le script ci-dessous avec la fonction "AdLibRegister()" glanée sur un autre site et qui fonctionne bien tant que le retour du ping est "0" ; je peux alors stopper la boucle grace au bouton "stop" sans pour autant quitter le programme, mais si le ping sort un code d'erreur autre que "0" alors mon bouton stop ne fonctionne plus et tout est bloqué et je ne comprend pas pourquoi. il ne me manque plus qu'a solutionner ce problème pour arriver au fonctionnement que je voulais au départ.
auriez vous une idée de pourquoi si le ping retourne autre chose que 0, tout se bloque ?
Cordialement,
Lionel
Pour clarifier le code j'ai enlevé tous les effet graphique de grisage des boutons
► Afficher le texte
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ###
$Form1 = GUICreate("Traqueur 1.0", 300, 97, 200, 147)
$host = GUICtrlCreateInput("", 8, 25, 153, 21)
$btn_go = GUICtrlCreateButton("Snif, snif ...", 168, 7, 57, 41)
$btn_stop = GUICtrlCreateButton("Stop !!!", 230, 7, 57, 41)
$titre1 = GUICtrlCreateLabel("Machine à traquer", 8, 5, 90, 17)
$Group1 = GUICtrlCreateGroup("Résultat", 8, 48, 217, 41)
$Label1 = GUICtrlCreateLabel("resulat", 24, 66, 60, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
TCPStartup()
GUICtrlSetState($btn_stop, $GUI_DISABLE)
GUICtrlSetData ($Label1, "Scan inactif")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $btn_go
;~ On lit le champ, si il n'est pas vide on rentre dans la boucle sans fin
$apinger = GUICtrlRead ($host)
if not $apinger = "" Then
AdlibRegister("let_ping")
EndIf
Case $btn_stop
AdlibUnRegister("let_ping")
GUICtrlSetData ($Label1, "Scan inactif")
EndSwitch
WEnd
Func let_ping()
local $ping = ping ($apinger, 150)
switch $ping
case 0
GUICtrlSetData ($Label1, "Hors ligne")
case else
GUICtrlSetData ($Label1, "En ligne")
EndSwitch
EndFunc
Re: [..] Boucle While et sortie de secours
Posté : mer. 15 oct. 2014 15:11
par jguinch
Merci d'utiliser la balise Spoiler pour le code de plus de 10 lignes.
Sinon, je pense que ça gèle un peu ta GUI parce que le AdlibRegister prends toute la place...
Est-ce que tu as vraiment besoin que cette fonction soit exécutée toutes les 250ms
Juste 1 seconde serait suffisant, non ?
Sinon, tu peux laisser 250ms par défaut et réduire la fréquence des ping en cas de non réponse :
► Afficher le texte
Code : Tout sélectionner
Func let_ping()
;~ Lecture du champ "Machine à traquer"
local $ping = ping ($apinger, 150)
local $error = @error
If $error Then AdlibRegister("let_ping", 1000) ; on passe à 1 seconde en cas de non réponse
[...]
Re: [..] Boucle While et sortie de secours
Posté : mer. 15 oct. 2014 15:23
par antolionel74
Oui, c'est bien ça, mes timeout étaient trop court.
Merci beaucoup
Re: [..] Boucle While et sortie de secours
Posté : mer. 15 oct. 2014 15:58
par jguinch
N'oublie pas de passer le sujet en [R] si le problème est résolu.