[R] Commande TCP bloque mon GUI

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Flashneo
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mer. 27 avr. 2016 16:22
Status : Hors ligne

[R] Commande TCP bloque mon GUI

#1

Message par Flashneo »

Bonjour,

Voilà je suis un petit nouveau dans la prog Autoit, et après quelque petit script je me suis dit que j'allais fait un tchat avec un serveur,
le problème c'est que mon serveur ressemble a ça :
► Afficher le texte
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <ColorConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

;Gui Principal
#Region ### START Koda GUI section ### Form=C:\Users\*******\******\Autoit script\Gui_serveur.kxf
Global $Serveur = GUICreate("Serveur", 577, 289, 317, 124)
Global $Console = GUICtrlCreateEdit("", 8, 8, 425, 233, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$WS_VSCROLL))
Global $Input = GUICtrlCreateInput("", 8, 256, 425, 21)
Global $Envoyer = GUICtrlCreateButton("Envoyer", 448, 256, 113, 25)
Global $Control = GUICtrlCreateGroup("Control", 448, 8, 113, 233)
Global $Utilisateur = GUICtrlCreateButton("Utilisateur", 456, 32, 97, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

;Gui Liste Utilisateur connecté
#Region ### START Koda GUI section ### Form=C:\Users\*******\******\Autoit script\Gui_serveur_list_client.kxf
Global $gui2 = GUICreate("Liste Client", 322, 309, 378, 234)
Global $list = GUICtrlCreateGroup("Utilisateur", 8, 8, 305, 289)
GUICtrlCreateEdit("", 24, 32, 273, 249, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlCreateGroup("", -99, -99, 1, 1)
#EndRegion ### END Koda GUI section ###

Global $iListenSocket = ""

start()


While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         TCPCloseSocket($iListenSocket) ; Arrête l'écoute
            msgConsole(2, "End Listening.")
            Sleep(200)
            msgConsole(0, "Fermeture du serveur (3sec)...")
            Sleep(2800)
            Exit

      Case $Utilisateur
         GUISetState(@SW_SHOW,$gui2)


   EndSwitch
WEnd


Func start() ; Prépare le serveur à l'écoute
   TCPStartup() ; Démarre le service TCP
      msgConsole(0, "Lance le service TCP.")

   Local $ipAdress = "127.0.0.1"
   Local $iPort = "416"
      msgConsole(0, "Ip : " & $ipAdress)
      msgConsole(0, "Port : " & $iPort)

   $iListenSocket = TCPListen($ipAdress, $iPort, 20) ; Lance l'écoute sur IP et le Port choisi

   If @error Then ; Vérifie si il n'y a pas d'erreur et renvoie sa valeur le cas écheant
      Local $iError = @error
      msgConsole(1, "Could not listen, Error code: " & $iError)
        Return False
   Else
      msgConsole(2, "Listen successful.")
    EndIf

EndFunc

Func Msgconsole(Const $flag, Const $msg) ; Permet d'afficher des messages dans la console

   Switch $flag
      ; Couleurs non-fonctionnelles...
     
      Case 0 ; Message Info écrit en noir
         GUICtrlSetData( $Console,"[" & @HOUR & ":" & @MIN & ":" & @SEC & "] (Info) " & $msg & @CRLF, 1)

      Case 1 ; Message Erreur ecrit en rouge
         GUICtrlSetData( $Console,"[" & @HOUR & ":" & @MIN & ":" & @SEC & "] (Erreur) " & $msg & @CRLF, 1)

      Case 2 ; Message de Statut écrit en vert
         GUICtrlSetData( $Console,"[" & @HOUR & ":" & @MIN & ":" & @SEC & "] (Statut) " & $msg & @CRLF, 1)

      Case 3 ; Message client écrit en orange
         GUICtrlSetData( $Console,"[" & @HOUR & ":" & @MIN & ":" & @SEC & "] " & $msg & @CRLF, 1)

   EndSwitch
EndFunc

Func connexion()
   msgConsole(0, "func connexion() START")

    Local $iSocket = 0 ; Variable utilisé pour l'écoute des sockets client
    Do ; Attend que quelqu'un se connect (Infini)

        $iSocket = TCPAccept($iListenSocket) ; Accept une connexion si présente ( Socket à fermer quand fini; Un socket par client)

        If @error Then ; Vérifie si il n'y a pas d'erreur et renvoie sa valeur le cas écheant
            $iError = @error
            msgConsole(1, "Could not accept the incoming connection, Error code: " & $iError)
            Return False
        EndIf
    Until $iSocket <> -1 ; Si le socket est différent de -1 le Client est connecté

    TCPCloseSocket($iListenSocket) ; Ferme l'écoute du socket pour permettre une nouvel connexion

    msgConsole(1, "Client Connected.")

    TCPCloseSocket($iSocket) ; Ferme le socket

EndFunc

Et j'aimerais qu'il affiche tout ce qu'il fait et que je puisse envoyer des commandes par cette interface (d'où l'input et le bouton envoyer)
Or je dois aussi vérifier si un client se connecte avec ma fonction connexion() Mais le problème c'est qu'elle rend le GUI inutilisable et je
vois pas comment la faire tourner en même temps que j'utilise mon GUI.

Donc je me retourne vers vous, car je bloque...
Ps: si vous avez une idée aussi pour les messages en couleur je suis preneur (c'est plus pratique a lire, et en plus c'est joli ^^)

Merci d'avance pour votre aide et vos réponse.
Modifié en dernier par Flashneo le jeu. 28 avr. 2016 14:24, modifié 1 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Commande TCP bloque mon GUI  

#2

Message par orax »

Tu peux supprimer la boucle While consacrée à l'interface graphique en utilisant Opt("GUIOnEventMode", 1). Regarde la fonction GUISetOnEvent.

Pour les couleurs, il faudra créer un contrôle RichEdit à la place de l'Edit.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Flashneo
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mer. 27 avr. 2016 16:22
Status : Hors ligne

Re: [..] Commande TCP bloque mon GUI

#3

Message par Flashneo »

D'accord merci beaucoup je vais essayer ça ! Peut tu m'expliquer pourquoi ? Car corriger une erreur c'est bien, la comprendre c'est encore mieux :)
Du coup cela va me permettre de corriger le problème de ma fenetre Utilisateur qui ferme le programme quand je la ferme.

Et c'est le même fonctionnement après ? Je vais regardé dans la doc car j'y avais déjà pensé mais j'avoue être un peu perdu avec cette commande...
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Commande TCP bloque mon GUI

#4

Message par orax »

Je ne sais pas comment l'expliquer.
Par défaut, c'est dans la boucle While principale...

Code : Tout sélectionner

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
	...
... que les interactions avec l'interface graphique (clic sur un bouton, ...) sont gérées, mais quand le script entre dans la fonction connexion() il reste bloqué dans cette fonction tant qu'il n'y a pas eu un client connecté.

Avec Opt("GUIOnEventMode", 1), la boucle While principale pour gérer les interactions avec l'interface graphique n'est plus nécessaire.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Flashneo
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mer. 27 avr. 2016 16:22
Status : Hors ligne

Re: [..] Commande TCP bloque mon GUI

#5

Message par Flashneo »

Oui je vois a peux près, on peut pas faire deux boucles en même temps et comme j'en lance une qui est en attente l'autre répond plus.
Dernière question mais sur les GUI, comment fait ont pour fermer simplement la fenêtre utilisateur et pas le programme ?

Edit: J'ai trouvé comment faire avec SetOnEvent, Merci pour l'aide tout fonctionne parfaitement maintenant.
Répondre