Page 1 sur 1

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

Posté : mer. 06 oct. 2010 18:30
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 !

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

Posté : mer. 06 oct. 2010 18:50
par Sh4dows
=> Questions ? postez ci dessous !
Très beau travail :lol:
Sa permet d'aider les débutants...

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

Posté : jeu. 07 oct. 2010 00:23
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

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

Posté : jeu. 07 oct. 2010 15:55
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 ^__^

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

Posté : jeu. 07 oct. 2010 16:50
par Manwe
Pas de question, mais merci pour l'info, je vois déjà des applications possibles.

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

Posté : jeu. 07 oct. 2010 19:05
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

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

Posté : dim. 10 oct. 2010 10:46
par SrBelial
content que cela plaise ^__^
c'est encourageant pour continuer mes explications sur ces petits concepts relativement utiles ...

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

Posté : dim. 10 oct. 2010 17:54
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

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

Posté : lun. 11 oct. 2010 12:12
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 ... !

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

Posté : lun. 11 oct. 2010 14:28
par orosseels
Pas de questions mais félicitation pour ce petit tuto. C'est très intéressant ! :D

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

Posté : lun. 01 nov. 2010 19:41
par bloodwolff
Bravo pour cet impressionnant tutoriel, tu es hors de tout doute mon nouveau dieu SrBelial ! :shock:

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

Posté : mar. 02 nov. 2010 17:33
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é !!