[EX] Niveau Debutant : Débuter avec le "multi-threading"

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Avatar du membre
SrBelial
Niveau 7
Niveau 7
Messages : 335
Enregistré le : jeu. 22 juil. 2010 11:29
Localisation : 81 et 31
Status : Hors ligne

[EX] Niveau Debutant : Débuter avec le "multi-threading"

#1

Message par SrBelial »

Rebonjour à tous !
Amusons nous un tout petit peu avec du threading ... !!

=> C'est quoi un thread ?
Un thread, c'est l'ami du développeur, dans bien des cas !
On peut décrire un thread ainsi : c'est l'exécution de code parallèle à l'exécution du code principal de l'application. En gros ça veut dire : un programme exécute du code de façon séquentielle, il parcours ce que l'on a écrit dans l'ordre, pas de mystère, on sait que si on fait un appel à la fonction a() avant la fonction b(), alors la fonction a() sera exécutée avant la fonction b(). Dans le cas d'un thread, on permet qu'une autre séquence de code soit exécutée parallèlement au reste du code de l'application (qui lui continue comme si de rien n'était).
Et qui plus est, le code threadé partage le même espace mémoire que la boucle d'exécution principale (c'est plutôt sympa, ça permet de mettre à jour des variables, des handles, de lire et écrire dans des fichiers et mettre tout ça dans des buffers ... tout pour s'amuser quoi !)

voila pour la partie théorie foireuse .... ('tain c'est vachement plus compliqué à expliquer que ce que je pensais au début ... en fait c'est plus intuitif à manipuler qu'à expliquer, donc n'ayez pas peur si vous n'avez rien compris à ce que j'ai dis au dessus !)

=> Comment on crée un thread ?
En AutoIt (parce que c'est un peu le sujet quand même), créer un thread revient à déclarer que l'on souhaite exécuter une fonction choisie à un intervalle de temps régulier !
Ceci se fait par l'appel à la fonction AdLibRegister('NomFonction', fréquence en millisec).

=> Mais si je veux un thread qui exécute du code qu'une fois ?
Bah dans le code de la fonction threadée, je mets à la fin le code nécessaire à la destruction du thread : AdLibUnregister('NomFonction')

=> Exemple !
Voila, on reprend la partie pratique, c'est plus sympa :
* on prend le handle d'une fenêtre au hasard : la barre des tâches (compatibilité Win XP prouvée, sur vista et seven il faudra ptêtre changer le WinGetHandle)
* on enregistre la fonction qui sera exécutée dans le thread
* on fait ce qu'il faut pour pouvoir arrêter proprement le programme ...
* on lance une boucle infinie (parce que si le programme s'arrête, le thread n'existera pas
* en dessous j'ai déclarer deux fonctions, une qui sera exécutée toutes les 2 secondes par le thread, l'autre qui sert à quitter ...
* vous remarquerez que mon thread joue à intervalles réguliers avec la transparence de la barre des tâches, amusez vous à l'adapter !

Code : Tout sélectionner

;***************************************************************************************
;**     VARIABLE GLOBALE
;***************************************************************************************
Global $handleBarreDesTaches = WinGetHandle("[CLASS:Shell_TrayWnd]", "")

;***************************************************************************************
;**     CODE PRINCIPAL
;***************************************************************************************
AdlibRegister("Play", 2500)
HotKeySet("!t", "Restore")

While 1
    sleep(10000)
WEnd

;***************************************************************************************
;**     FONCTIONS
;***************************************************************************************
Func Play()
    For $i = 254 To 2 Step -1
        WinSetTrans($handleBarreDesTaches, "", $i)
    Next
    sleep(150)
    For $i = 1 To 255 Step 1
        WinSetTrans($handleBarreDesTaches, "", $i)
    Next
EndFunc

Func Restore()
    AdlibUnRegister("Play")
    WinSetTrans($handleBarreDesTaches, "", 255)
    Exit
EndFunc
=> Questions ? postez ci dessous !
.-SrB-. The One
  • NON ! AutoIt n'est PAS un langage réservé à la réalisation de bots !
  • OUI ! AutoIt est un langage à part entière !
  • Dans SciTE sélectionnez 1 mot puis F1
  • Don't want english doc ?? go to documentation française !! >>ICI<<
[/size]
Sh4dows
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#2

Message par Sh4dows »

=> Questions ? postez ci dessous !
Très beau travail :lol:
Sa permet d'aider les débutants...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#3

Message par Tlem »

[blink]***** ATTENTION *****[/blink]
Petit bémol à ce qu'a dit mon petit camarade SrBelial.

Pour le moment, en l'état (j'espère que cela changera), AutoIt et incapable de gérer plusieurs actions/fonctions/commandes en parallèle.
Donc en réalité le thread donc parle SrBelial est un pseudo thread, car lorsqu'il est exécuté, il met en pause le reste du code principal.

Dans la pratique, cela ce traduit par le blocage du code principale car la fonction appelée par le AdlibRegister et une fonction bloquante.
Genre, une fonction appelée toutes les 4 secondes, mais qui met 5 secondes à s'exécuter.
Comme dans cet exemple :

Code : Tout sélectionner

;***************************************************************************************
;**     CODE PRINCIPAL
;***************************************************************************************
AdlibRegister("MaFonction", 4000)

While 1
    sleep(500)
    ConsoleWrite(@SEC & @CRLF)
WEnd

;***************************************************************************************
;**     FONCTIONS
;***************************************************************************************
Func MaFonction()
    Sleep(5000)
EndFunc
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
SrBelial
Niveau 7
Niveau 7
Messages : 335
Enregistré le : jeu. 22 juil. 2010 11:29
Localisation : 81 et 31
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#4

Message par SrBelial »

Oui, merci pour la précision j'avais omis ce point !
en effet, pas de vrai multi-threading ... un jour peut être ^___^

je rajoute également un autre point que j'avais oublié :

On ne peut pas enregistrer 2 fois la même fonction avec des fréquences différentes.
Par exemple on souhaite appeler la fonction toto toutes les 2 secondes mais aussi une fois de plus toutes les minutes :

Code : Tout sélectionner

AdLibRegister("toto", 2000)
AdLibRegister("toto", 60*1000)
 
Dans ce cas, le second appel écrase simplement l'ancienne valeur, par conséquent la fonction ne se relancera plus qu'une seule fois toutes les minutes.

Une solution de contournement serait d'enregistrer deux fonctions différentes, avec la seconde fonction qui se contenterait de faire un appel à la première ! => hop contourné !

voila voila ... des questions ?

PS : @Sh4dows : merci pour le compliment ^__^
.-SrB-. The One
  • NON ! AutoIt n'est PAS un langage réservé à la réalisation de bots !
  • OUI ! AutoIt est un langage à part entière !
  • Dans SciTE sélectionnez 1 mot puis F1
  • Don't want english doc ?? go to documentation française !! >>ICI<<
[/size]
Avatar du membre
Manwe
Niveau 4
Niveau 4
Messages : 57
Enregistré le : mer. 08 oct. 2008 09:21
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#5

Message par Manwe »

Pas de question, mais merci pour l'info, je vois déjà des applications possibles.
Un clavier azerty en vaut deux.
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#6

Message par Jerome »

Coucou,


Merci d'avoir fait ce petit tuto, j'avoue que ce coté d'autoit était un peu sombre pour moi (comme beaucoup d'autre endroit :) )




Jérôme
Avatar du membre
SrBelial
Niveau 7
Niveau 7
Messages : 335
Enregistré le : jeu. 22 juil. 2010 11:29
Localisation : 81 et 31
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#7

Message par SrBelial »

content que cela plaise ^__^
c'est encourageant pour continuer mes explications sur ces petits concepts relativement utiles ...
.-SrB-. The One
  • NON ! AutoIt n'est PAS un langage réservé à la réalisation de bots !
  • OUI ! AutoIt est un langage à part entière !
  • Dans SciTE sélectionnez 1 mot puis F1
  • Don't want english doc ?? go to documentation française !! >>ICI<<
[/size]
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 415
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#8

Message par jl56 »

Bonjour

Merci pour cet exemple et pour les autres également

c'est extrêmement intéressent de voir un exemple simple expliquer de façon aussi magistrale un concept.

S.V.P. continuez

A+ JL56
Avatar du membre
SrBelial
Niveau 7
Niveau 7
Messages : 335
Enregistré le : jeu. 22 juil. 2010 11:29
Localisation : 81 et 31
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#9

Message par SrBelial »

merci pour toutes ces remarques et compliments !
j'avoue que la difficulté est là : conserver un exemple le plus minimaliste possible pour que les gens puissent se concentrer sur l'essentiel ...
j'entends bien continuer, lorsque j'ai un peu de temps je me penche sur de nouveaux petits concepts ... mais une grande partie de mon inspiration vient des requêtes que l'on peut trouver dans la partie demande d'aide du forum ... on constate bien souvent que les gens ont des connaissances très insuffisantes pour être à même de résoudre les problèmes qu'ils nous envoient ... !
.-SrB-. The One
  • NON ! AutoIt n'est PAS un langage réservé à la réalisation de bots !
  • OUI ! AutoIt est un langage à part entière !
  • Dans SciTE sélectionnez 1 mot puis F1
  • Don't want english doc ?? go to documentation française !! >>ICI<<
[/size]
orosseels
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mar. 24 août 2010 15:27
Localisation : Belgique
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#10

Message par orosseels »

Pas de questions mais félicitation pour ce petit tuto. C'est très intéressant ! :D
Avatar du membre
bloodwolff
Membre émérite
Membre émérite
Messages : 655
Enregistré le : ven. 18 avr. 2008 22:36
Localisation : Québec
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#11

Message par bloodwolff »

Bravo pour cet impressionnant tutoriel, tu es hors de tout doute mon nouveau dieu SrBelial ! :shock:
Compte skype : bloodwolfff
Avatar du membre
SrBelial
Niveau 7
Niveau 7
Messages : 335
Enregistré le : jeu. 22 juil. 2010 11:29
Localisation : 81 et 31
Status : Hors ligne

Re: [EX] Niveau Debutant : Débuter avec le "multi-threading"

#12

Message par SrBelial »

merci c'est apprécié ^__^
je songe d'ailleurs à fonder une nouvelle religion, que ceux qui sont motivés me le disent, ils auront une place dans mon clergé !!
.-SrB-. The One
  • NON ! AutoIt n'est PAS un langage réservé à la réalisation de bots !
  • OUI ! AutoIt est un langage à part entière !
  • Dans SciTE sélectionnez 1 mot puis F1
  • Don't want english doc ?? go to documentation française !! >>ICI<<
[/size]
Répondre