Button in Programmschleife richtig abfragen !?!?

  • Hallo zusammen,

    ich versuche mich gerade an einem Terminal-Programm. Es soll mittels "TCPRecv" alphanumerische Daten empfangen. Aus der AutoIT Hilfe habe ich mir etwas zurecht gebastelt was bis auf eine Kleinigkeit gut funktioniert.

    Ich kann die IP-Adresse und den Port frei wählen und dann lauschen. Wenn mein Controller Daten sendet wird dies in einem Textfeld korrekt angegeben. Das starten des Clients funktioniert richtig weil es in der Hauptschleife sitzt. Das stoppen kann aber dort nicht funktionieren da ja der "TCPRecv" im Loop läuft. Nun hab ich mir gedacht das der Loop der "TCPRecv" mittels eines Stop Button angehalten werden soll. Und das funktioniert leider nicht. In Zeile 111 unterbricht eine Variable den Loop. Wenn ich auf "Client Stopp" klicke kommen keine Daten mehr aber das Programm lässt sich über das rote X oben rechts nicht beenden oder durch "Client Start" wieder empfangsbereit machen.

    Vielleicht kann mir jemand auf die Sprünge helfen.

    Hier der Code:

    Vielen Dank fürs durchlesen :)

    Grüße Jochen

  • Hi Greenhorn,

    danke für deine Antwort. Leider kommt sofort die Fehlermeldung

    (43,17) : warning: $nMsg: possibly used before declaration.

    Switch $nMsg

    und

    (43,17) : error: $nMsg: undeclared global variable.

    Switch $nMsg

    was ja logisch ist, da die Variable $nMsg in Zeile 42 deklariert wird.

    Ich habe so auskommentiert:

    Code
    While 1
    
      ;$nMsg = GUIGetMsg()
    
        Switch $nMsg
    
            Case $Button_Start_Client

    Grüße ;)

  • Hi,

    Deine Funktion Example() aktiviert den OnEventModus, dieser deaktiviert GUIGetMsg():

    Wenn die GUIOnEventMode-Option auf 1 gesetzt ist, ist der Rückgabewert von GUIGetMsg immer 0, und @error wurde auf 1 gesetzt.

    Generell ist es ratsam entweder mit OnEventMode oder mit GetMsg zu arbeiten, nicht aber beide zu kombinieren.

    Hier mal ein kleines Beispiel wie ein Grundgerüst, welches Arbeitet und gleichzeitig auf Knopfdrücke reagieren soll, im OnEventMode aussehen könnte.

    In diesem Fall wird eine Funktion alle 250ms per AdlibRegister aufgerufen und schreibt etwas Text in ein Edit-Control.

    Vielleicht bringt es dich etwas weiter.

    mfg

    Zeitriss

  • Ein kleiner Tip zum EventMode: Wenn du keine Lust hast für jeden Button eine eigene Funktion zu schreiben kann man auch eine übergeordnete Funktion für alle Buttons (z.B. "Gui_Button_Event") registrieren und innerhalb dieser Funktion via "Switch @GUI_CtrlId" bestimmen welches Ctrl man verwalten möchte (und dann die Aktionen aus Gui_button_start/stop ausführen). Das ist manchmal sinnvoll wenn man den Überblick behalten will und die Funktionen allesamt sehr klein sind, sodass es sich nicht lohnt 20 Einzeiler-Funktionen zu haben. Aber das entscheidet im Endeffekt jeder für sich selbst :)

    lg

    M

  • Hi, sorry, hatte damals nur flüchtig drübergeschaut und wollte auf den Konflikt zwischen Event-Mode und Nachrichtenschleife hinweisen.

    Wie auch immer, die anderen haben ja bereits erklärt wo der Wurm drin ist.

    So sollte es dann wirklich laufen:

    LG

    Greenhorn