Page 1 sur 1

[R] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 02:50
par lacnia
Hey ! Bonsoir tout le monde ! ( Bonjour s'il fait jour ! 8) )

Alors je vous explique, je voulais coder, pour apprendre, une GUI qui recevrais des item dans sa ListView selon les connections entrantes/sortantes, qui afficherait par exemple à quelle IP/PORT l'ordinateur est connecté, bref cela n'est pas le problème ...
Le problème vient du fait que cela doit être plus ou moins au feeling, je m'explique :
Dès que l'ordinateur se connecte à une IP, celle ci est ajouter comme item de ListView de la GUI, sans avoir à actualiser ....
Seulement, pour faire sa je suis obligé de faire une boucle infini qui appellerais la fonctions toutes les 200MS, mais comme il est impossible d’exécuter une boucle en fond, cette boucle empêche toute intervention de la part de l'user via la GUI et c'est un peu trop brouillon à mon gout sa xD

Après quelques recherches sur internet, j'ai vite fais adopté l'idée de faire cela en deux script, un script comportant la GUI, et un autre la boucle infini qui me gênait, et le script comportant la boucle infini aurait pour rôle d'envoyer les donné directement dans la GUI, par exemple si elle détecte que l'ordinateur est connecté à l'ip 165.27.***.** , alors elle l'envoi à la GUI ...
Cela me paraît une bonne solution, seulement je ne sais pas du tout, et n'ai pas la moindre idée de comment faire en sorte que les donné reçus par le script de la boucle soit envoyées directement sur la GUI ...

Exemple de la GUI que j'utilise pour mes test ( Exemple pris sur Autoit Help ) :

Code : Tout sélectionner

    GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
    GUISetBkColor(0x00E0FFFF) ; will change background color

    Local $idListview = GUICtrlCreateListView("Hour  |Min|Sec  ", 10, 10, 200, 150) ;,$LVS_SORTDESCENDING)
    Local $idButton = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
    Local $idItem1 = GUICtrlCreateListViewItem(@HOUR & "|" & @MIN & "|" &@SEC, $idListview)

    GUICtrlCreateInput("", 20, 200, 150)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping
    GUISetState(@SW_SHOW)


    ; Loop until the user exits.
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop

            Case $idButton

            Case $idListview

        EndSwitch
    WEnd
 
Là par exemple, le script externe aurait pour rôle d'envoyer l’heure actuelle toutes les 1 secondes ...

J'ai tenté quelques recherches par rapport à cette main d’œuvre mais je n'ai pas trouvé quelque chose, d’ailleurs je ne vois pas vraiment quelle mot clé utiliser, si jamais quelqu'un pourrais m'éclairer à ce sujet, sa serait super sympa de sa part !

PS : Toute aide est la bienvenue, même si ce n'est qu'un mot clé, un lien, le nom d'une fonction, sa m'aidera énormément, merci encor :D.
PS2 : Désoler à vos yeux pour les fautes d'orthographes et ce post écris à la vas-vite, il se fait tard et je suis fatigué :? .

Re: [..] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 08:58
par blacksoul305
Bonjour,

j'ai deux idées qui me viennent toute suite en tête. Tu peux :

- créer un fichier temporaire que met à jour le programme qui s'occupe de vérifier qui se connecte où, et le lire avec ton programme qui utilise la GUI.

- utiliser les sémaphores. Je n'y connais pour ainsi dire rien, légèrement le principe, mais je pense que ça serait plus efficaces. Je te laisse regarder ces liens sur le forum qui en ont parlé !

Tutoriel sur la sémaphorisation.

Demande d'aide sur les sémaphores généraux

Bon courage !

Re: [..] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 11:52
par lacnia
Je te remercie blacksoul305 ! Je voir ce qu'est la sémaphorisation :o Je dirais que c'est compliqué vue le nom mais bon, comme on dit, l'habille ne fait pas le moine x).

Re: [..] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 11:55
par mikell
Merci de ne pas citer le message précédent dans ta réponse

Tu as essayé AdlibRegister("ma_fonction", 500) ?

Re: [..] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 22:50
par lacnia
Bonsoir, merci d'avoir fait par de cette aide !
Mais un adlibregister fait appelle à beaucoup de ressources du processeurs non ? Sa n'a pas d'impact négatif par rapport au script ?

Re: [..] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 23:05
par mikell
Pas plus qu'une boucle, c'est une bonne alternative si on veut "libérer" la boucle principale
De toute façon avec 2 scripts, tu devras bien mettre dans une boucle du script1 un check sur ce que retourne le script2, non ?

Edit
Rectification : si tu fais un AdlibRegister("ma_fonction", 500) sur une fonction qui met 1 seconde à s'exécuter, là il risque en effet d'y avoir un souci :mrgreen:

Re: [..] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 23:06
par lacnia
Je pensais à ce que le truc écrivent directement les donné dans la listView de la GUI mais bon sa serait difficile à gérer après, je n'avais pas vraiment use adlib auparavant, mais j'ai fais deux trois test là et je le trouve assez utile finalement, je finis le cour sur la sémaphorisation qui est assez intéressant puis je test le tout, si c'est bon, je mettrais le post en résolu, merci encor :)

Re: [..] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 23:37
par orax
mikell a écrit :Rectification : si tu fais un AdlibRegister("ma_fonction", 500) sur une fonction qui met 1 seconde à s'exécuter, là il risque en effet d'y avoir un souci :mrgreen:
Je ne suis pas sûr de ça, je viens de faire un test en modifiant l'exemple de la doc pour que la fonction enregistrée par AdlibRegister mette du temps à s'exécuter.
Avec AdlibRegister("MyAdLibFunc", 1), la fonction met 1 s ou plus à s'exécuter mais elle ne s'exécute à nouveau que lorsqu'elle est terminée.

Code : Tout sélectionner

MyAdLibFunc called 3 time(s)
937.40995060836
MyAdLibFunc called 4 time(s)
4292.24430791471
MyAdLibFunc called 5 time(s)
933.503493554993
MyAdLibFunc called 6 time(s)
Il y a aussi le mode Opt("GUIOnEventMode", 1) pour que la partie GUI ne soit pas gérée dans la boucle principale.

Re: [..] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 23:43
par lacnia
Je n'avais pas non plus pensé au GUI set event, en le mélangeant avec le adlib sa devrait faire un truc potable xD ....

La fonction devrait durer entre 200 et 500 MS je pense, sinon quelqu'un saurait comment faire pour qu'adlib fasse son appelle de fonction seulement 100 MS après que le call précédent soit terminé ?

Re: [..] Communication GUI autoit / script externe

Posté : ven. 18 juil. 2014 23:53
par mikell
Si tu n'appelles pas ça un souci, tu l'appelles comment ? :wink:
► Afficher le texte

Re: [..] Communication GUI autoit / script externe

Posté : sam. 19 juil. 2014 00:03
par lacnia
Mikell, le fait d'appeler toutes les 10MS la fonction sleep(250) empêche l'utilisation de la GUI xd
Je n'ai pas très bien compris xD Tu as fais exactement la chose qu'Orax disait qu'il ne fallait pas faire :o

Re: [..] Communication GUI autoit / script externe

Posté : sam. 19 juil. 2014 00:42
par orax
mikell a écrit :Si tu n'appelles pas ça un souci, tu l'appelles comment ? :wink:
Un souchi ? Image
Je viens seulement de comprendre où tu voulais en venir. :oops: Je pensais que tu voulais dire qu'il pouvait avoir plusieurs exécutions de _fonction() à un instant t à cause de AdlibRegister.

Donc effectivement ça posera un problème. Toutefois, avec Opt("GUIOnEventMode", 1) on peut cliquer sur le bouton sans souci.
► Afficher le texte
lacnia a écrit :sinon quelqu'un saurait comment faire pour qu'adlib fasse son appelle de fonction seulement 100 MS après que le call précédent soit terminé ?
► Afficher le texte

Re: [..] Communication GUI autoit / script externe

Posté : sam. 19 juil. 2014 10:54
par mikell
Oui, avec OnEvent ou GuiRegisterMsg une fonction peut être lancée en interrompant la fonction en cours d'exécution
lacnia a écrit :... appelle de fonction seulement 100 MS après que le call précédent soit terminé ?
Pour ça plus besoin d'AdlibRegister (ni de boucle d'ailleurs)

Code : Tout sélectionner

_fonction()

While 1
  Sleep(10)
Wend

Func _fonction()
    ; ... code
    Sleep(100)   ; attend 100ms
    Return _fonction()  ; quitte et relance
EndFunc