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. :lol:
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

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

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. :D

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.