[R] Boucle et exécution

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Christelle10
Niveau 4
Niveau 4
Messages : 68
Enregistré le : jeu. 02 déc. 2010 03:35
Status : Hors ligne

[R] Boucle et exécution

#1

Message par Christelle10 »

Bonjour, voilà j'ai un petit script demandant une boucle qui me consomme pas mal de cpu peu etre que celui ci serait mal codé ?
► Afficher le textecode
la demande est de chercher en position [700, 300] si la couleur est [#FF6600] si elle est [#FF6600] on clique sur [700, 300] si elle ne l'est pas on cherche toujours et cela en boucle (meme après avoir cliqué il recherche de nouveau ...)

es ce possible en usant moins de cpu ?
merci.
Modifié en dernier par Christelle10 le sam. 04 déc. 2010 18:04, modifié 1 fois.
Avatar du membre
pop45
Membre émérite
Membre émérite
Messages : 251
Enregistré le : dim. 30 août 2009 16:18
Status : Hors ligne

Re: [..] boucle et exécution

#2

Message par pop45 »

Solution toute simple :)
Rajoute un sleep(1) dans ta boucle
Même si cela ralentira l'execution le script fera l'action "au moin" 999 fois par seconde :)
Cordialement Pop45
Veuillez agrée nos sentiment les plus distinguer, soyez assurer de mon entièr et amical collaboration, bien a vous pour toujours et a jamais dans l'unique but de servir l'espérance de votre satisfaction.
Christelle10
Niveau 4
Niveau 4
Messages : 68
Enregistré le : jeu. 02 déc. 2010 03:35
Status : Hors ligne

Re: [..] boucle et exécution

#3

Message par Christelle10 »

même avec une sleep(1) mon cpu prend une claque :(
presque 30% en plus
pas d'autre moyen ?

merci pour cette premier réponse.
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

Re: [..] boucle et exécution

#4

Message par jbnh »

1, ce n'est pas assez. Mettez plutot 50, si cela rame encore 100 etc
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
Christelle10
Niveau 4
Niveau 4
Messages : 68
Enregistré le : jeu. 02 déc. 2010 03:35
Status : Hors ligne

Re: [..] boucle et exécution

#5

Message par Christelle10 »

jbnh a écrit :1, ce n'est pas assez. Mettez plutot 50, si cela rame encore 100 etc
formidable !
avec sleep(100) il ne prend quasi plus rien (ram moins)

merci beaucoup à vous.
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [R] Boucle et exécution

#6

Message par zeshrek »

Ou encore, une autre solution :

Code : Tout sélectionner

HotKeySet("{ESC}", "_sortie")               ; on se reserve une porte de sortie au cas ou
AdlibRegister("_testpixel",100)             ; toutes les 100 ms on execute _testpixel

While 1                                     ; et pendant ce temps...
    sleep (1000)                            ; ... on ne fait...
WEnd                                        ; ... strictement rien !

Func _testpixel()                           ; fonction qui teste la couleur du pixel
    $COLOR = PixelGetColor(700, 300)
    If $COLOR = "0xFF6600" Then
        AdlibUnRegister("_testpixel")       ; on desactive l'appel a la fonction toutes les 100 ms (risque d'appel pendant que la fonction s'execute)
        _clic()                             ; on fait qe qu'il y a a faire
        AdlibRegister("_testpixel",100)     ; et on réactive l'appel a la fonction toutes les 100 ms
    EndIf
EndFunc

Func _clic()                                ; ... fonction appelée quand le test est bon
    MouseClick("Left", 700, 300, 2)
EndFunc

Func _sortie()                              ; la fameuse porte de sortie
    Exit
EndFunc 
Ca me prends moins de 1% de charge CPU...
Si vis pacem para bellum
Christelle10
Niveau 4
Niveau 4
Messages : 68
Enregistré le : jeu. 02 déc. 2010 03:35
Status : Hors ligne

Re: [R] Boucle et exécution

#7

Message par Christelle10 »

et quel est la différence entre :

Code : Tout sélectionner

AdlibRegister("_testpixel",100)             ; toutes les 100 ms on execute _testpixel

While 1                                     ; et pendant ce temps...
    sleep (1000)                            ; ... on ne fait...
WEnd


et


Code : Tout sélectionner

While 1                                     ; et pendant ce temps...
    sleep (100)  
     _testpixel()                          ; ... on ne fait...
WEnd


?
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [R] Boucle et exécution

#8

Message par zeshrek »

Ma solution permet de faire autre chose pendant ce temps, et toutes les 100ms, la fonction s'executera. J'ai mis un sleep(1000) mais on peut imaginer que le script fait autre chose qu'attendre, ou plutot qu'il faut autre chose pendant qu'il attend.
Par exemple, voici le meme script qui ne fait strictement rien et pourtant pendant l'attente il affiche un chrono qui indique depuis combien, de temps il attend ton pixel de couleur.

Code : Tout sélectionner

#include <date.au3>
Global $timer, $Secs, $Mins, $Hour, $Time

HotKeySet("{ESC}", "_sortie")               ; on se reserve une porte de sortie au cas ou
AdlibRegister("_testpixel",100)             ; toutes les 100 ms on execute _testpixel

$timer=TimerInit()                          ; on met en place un chrono 
AdlibRegister("_timer",100)                 ; chrono qu'on appelle toutes les 100 ms lui aussi

While 1                                     ; et pendant ce temps...
    sleep (1000)                            ; ... on ne fait...
WEnd                                        ; ... strictement rien !

Func _testpixel()                           ; fonction qui teste la couleur du pixel
    $COLOR = PixelGetColor(700, 300)
    If $COLOR = "0xFF6600" Then
        AdlibUnRegister("_testpixel")       ; on desactive l'appel a la fonction toutes les 100 ms (risque d'appel pendant que la fonction s'execute)
        _clic()                             ; on fait qe qu'il y a a faire
        AdlibRegister("_testpixel",100)     ; et on réactive l'appel a la fonction toutes les 100 ms
    EndIf
EndFunc

Func _clic()                                ; ... fonction appelée quand le test est bon
    MouseClick("Left", 700, 300, 2)
EndFunc

Func _sortie()                              ; la fameuse porte de sortie
    Exit
EndFunc

Func _timer()                               ; le chrono qui affiche le temps d'attente en haut a gauche de l'écran
    _TicksToTime(Int(TimerDiff($timer)), $Hour, $Mins, $Secs)
    $Time = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)
    ToolTip($Time,1,1)
EndFunc
On pourrait imaginer plein de chose, souvent un script tout simple de qq lignes évolue. Quand il est fini, on se dit "ah tiens, je rajouterai bien tel truc". là, l'avantage c'est que tu n'es pas bridée.
Imagine qu'en évoluant ton script se retrouve avec la boucle qui s'éxécute en trop de temps et que du coup ton test ne se fait plus toutes les 100ms.

Sinon, pour répondre a ta question, sur le plan strictement fonctionnel les 2 scripts sont équivalents. C'est aussi une facon de montrer qu'il existe toujours plusieurs solutions a un probleme.
Si vis pacem para bellum
Christelle10
Niveau 4
Niveau 4
Messages : 68
Enregistré le : jeu. 02 déc. 2010 03:35
Status : Hors ligne

Re: [R] Boucle et exécution

#9

Message par Christelle10 »

merci beaucoup pour ces exemples qui me font fortement avancer :)
Répondre