Page 1 sur 1
[R] Une boucle While qui ne bloque pas le code entier ?
Posté : ven. 13 mai 2011 20:54
par Yarillo
Bonjour/bonsoir.
Je commence à ne plus compter le nombre de fois ou je dois vous appeler à l'aide.
J'ai tenté quelques recherches avant de demander ici, mais ce fut pas très fructueux (Je savais pas quoi chercher à vrai dire).
Le titre est explicite mais il ne correspond pas exactement à mon problème, je m'explique.
Je sais que les boucles While & Until sont dangereuses parce qu'elles ont tendance à bloquer le code si elles sont trop... rapides ?
Bref, j'ai essayé de faire ce code :
Code : Tout sélectionner
Func Main()
While 1
Sleep(10000)
<Choses à faire>
WEnd
EndFunc
Je pensais que la fonction devrait paralyser le code un demi gogolplexe de seconde toutes les 10000millisecondes, mais le Sleep() semble s'appliquer sur tout le script, (donc sur le GUI :/) au lieu de comme je l'aurais voulu juste sur la fonction.
Malheureusement l'ordinateur fait ce qu'on lui dit de faire, et pas ce qu'on veut faire donc... tant que je saurais pas lui signifier, je reste jambon.
Quelqu'un aurait une solution à ce problème ?
Re: [..] Une boucle While qui ne bloque pas le code entier ?
Posté : ven. 13 mai 2011 21:04
par Strofe
Bonsoir
Je sais que les boucles While & Until sont dangereuses parce qu'elles ont tendance à bloquer le code si elles sont trop... rapides ?
Ah bon ??
Je ne comprends pas votre demande !!!
En quoi la boucle bloque-t-elle le code ???
Re: [..] Une boucle While qui ne bloque pas le code entier ?
Posté : ven. 13 mai 2011 21:11
par Yarillo
Je me doutais que cette phrase allait poser soucis, je savais pas comment la formuler.
Code : Tout sélectionner
#include <GUIConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 625, 443, 193, 125)
$Button1 = GUICtrlCreateButton("Button1", 192, 96, 225, 73, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$TestValue = 0
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Main()
EndSwitch
WEnd
Func Main()
While 1
$TestValue = $TestValue + 1
WEnd
EndFunc
Voilà l'exemple typique, une interface avec un bouton, quand on appuie sur le bouton ça appelle une boucle While qui va sans cesse ajouter 1 à une variable.
Une fois qu'on aura appuyé sur le bouton, il sera totalement impossible de faire quoi que ce soit sur le GUI.
Re: [..] Une boucle While qui ne bloque pas le code entier ?
Posté : ven. 13 mai 2011 21:19
par Strofe
Bonsoir
Normal dans la fonction vous faîtes une boucle infinie.
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
global $combien = 0
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 625, 443, 193, 125)
$Button1 = GUICtrlCreateButton("Button1", 192, 96, 225, 73, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$TestValue = 0
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Main()
GUICtrlSetData ($Button1, $combien)
EndSwitch
WEnd
Func Main()
$combien +=2
EndFunc
Re: [..] Une boucle While qui ne bloque pas le code entier ?
Posté : ven. 13 mai 2011 21:28
par Yarillo
Le soucis, c'est que certains scripts peuvent demander l'utilisation d'une boucle de ce type, je m'explique encore plus en détail.
Je veux faire un petit programme qui,
Quand on appuie sur un bouton de lancement, enregistre le code d'une page web , le stocke, attend quelques secondes puis actualise et reprend le code pour vérifier si quelque-chose a changé depuis.
Si quelque-chose a changé ça ouvre une MsgBox
Si rien n'a changé, ça recommence.
Et ce jusqu'à ce qu'on ait cliqué une seconde fois sur le bouton.
C'est le "Jusqu'à ce qu'on ait cliqué une seconde fois sur le bouton" qui pose problème, vu que dès que la boucle est lancée, l'intégralité du script est endormi.
Re: [..] Une boucle While qui ne bloque pas le code entier ?
Posté : ven. 13 mai 2011 21:55
par Tlem
Regardez du coté de
AdlibRegister.
Re: [..] Une boucle While qui ne bloque pas le code entier ?
Posté : ven. 13 mai 2011 22:17
par Strofe
Bonsoir
Je pensais à cela : _Timer_SetTimer
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
#include <Timers.au3>
Dim $timer
Global $lbl1
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 625, 443, 193, 125)
$Button1 = GUICtrlCreateButton("Inactif", 192, 96, 225, 73, 0)
$lbl1 = GUICtrlCreateLabel("__:__:__:__",100,10,200,15)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
If GUICtrlRead($Button1)="Inactif" then
GUICtrlSetData ($Button1, "Actif")
$timer = _Timer_SetTimer($Form1, 3000, "_CtrlEcart")
If @error Or $timer = 0 Then ContinueLoop
Else
_Timer_KillTimer($Form1,$timer)
GUICtrlSetData ($Button1, "InActif")
EndIf
EndSwitch
WEnd
Func _CtrlEcart($Form1, $Msg, $iIDTimer, $dwTime)
#forceref $Form1, $Msg, $iIDTimer, $dwTime
;~ Controle écart
;~ si écart affiche message
beep(500,500)
GUICtrlSetData($lbl1,@hour & ":" & @min & ":" & @SEC & ":" & @MSEC)
EndFunc
A+
Re: [..] Une boucle While qui ne bloque pas le code entier ?
Posté : ven. 13 mai 2011 22:30
par Yarillo
@Tlem
Excellent, ça fonctionne à merveille.
@Strofe
Excellent aussi, je n'ai pas testé mais ça me sera super utile.
Vous avez décidément réponse à tout. Merci à vous deux.

Re: [R] Une boucle While qui ne bloque pas le code entier ?
Posté : sam. 14 mai 2011 09:08
par jchd
Il y a une autre possibilité : AutoItSetOption("GUIOnEventMode", 1)
On n'a alors plus besoin d'une boucle pour gérer les messages du GUI.