AdlibRegister

  • Sry für die späte Antwort..

    Du schreibst doch Zeile für Zeile rein, dann setz wenn du eine Zeile drinne hast einfach ein @CRLF und dann die nächste Zeile.
    Du sicherst vorher den alten Eintrag und vergleichst ihn mit dem neuen, wenn es ungleich ist dann nimmst du den neuen Eintrag als alten Eintrag und vergleichst wieder, und bei jedem Unterschied immmer davor ein @CRLF rein.

    Ich habs versucht umzusetzen aber ich denke so wie es aussieht...

    [autoit]


    $fc2 = Run("C:\Program Files (x86)\Ubisoft\Far Cry 2\bin\FC2ServerLauncher.exe", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Func Start()
    $line = StdoutRead($fc2)
    If @error Then Exit
    If $line <> "" Then
    GUICtrlSetData($Edit1, $line, 1)
    EndIf
    $line = StderrRead($fc2)
    If @error Then Exit

    [/autoit][autoit][/autoit][autoit]

    EndFunc ;==>Start

    [/autoit]


    wird es nicht Zeile für Zeile rein geschrieben...aber verstehe nicht viel von StdoutRead.

    Ich habs dann über die Log-Datei probiert..

    [autoit]

    #include <EditConstants.au3>
    #include <GuiEdit.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 400, 400, 192, 124)
    $Edit1 = GUICtrlCreateEdit("", 0, 5, 398, 387)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit][autoit][/autoit][autoit]

    Global $file = FileOpen("C:\Program Files (x86)\Ubisoft\Far Cry 2\bin\dedicated_log.txt", 0)
    Global $line

    [/autoit][autoit][/autoit][autoit]

    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    While 1
    $newline =FileReadLine($file)& @CRLF
    If @error = -1 Then ExitLoop
    If $line <> $newline Then
    GUICtrlSetData($Edit1,$line,1)
    ;~ MsgBox(0, "Line read:", $line)
    $line = $newline
    EndIf
    Sleep(10)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()

    [/autoit][autoit][/autoit][autoit]

    FileClose($file)

    [/autoit]


    aber ich weiss nicht wie ich @CRLF nach jeder Zeile anfügen kann.

  • Ok StdOutRead wird mit AdlibRegister auch permanent ausgelesen.

    Da ich dein Tip nicht umsetzen konnte habe ich eine andere Lösung gefunden

    Das ist die originale Funktion

    [autoit]

    AdlibRegister("_Messages", 60000)

    [/autoit][autoit][/autoit][autoit]

    Func _Messages()
    Local $readCon, $aStarted, $aEnded, $readInput

    [/autoit][autoit][/autoit][autoit]

    $readCon = GUICtrlRead($Edit1, "")
    $aStarted = StringRegExp($readCon, "message:\s(Match\sstarted\!)")
    $aEnded = StringRegExp($readCon, "message:\s(Match\sended\!)")
    If $aStarted = True Then
    $readInput = GUICtrlRead($Input3)
    ControlSend("C:\Program Files (x86)\Ubisoft\Far Cry 2\bin\FC2ServerLauncher.exe", "", "", "say " & $readInput & @CRLF)
    If $aEnded = True Then
    AdlibUnRegister("_Messages")
    EndIf
    EndIf
    EndFunc ;==>_Messages

    [/autoit]

    So habe ich es gelöst, ist zwar etwas umständlich aber funktioniert Tip Top

    Spoiler anzeigen
    [autoit]

    AdlibRegister("_Started")

    [/autoit] [autoit][/autoit] [autoit]

    Func _Started()
    Local $readCon, $aStarted
    $readCon = GUICtrlRead($Edit1)
    $aStarted = StringRegExp($readCon, "message:\s(Match\started\!)")
    If $aStarted = True Then
    _sendMessages()
    _replaceStarted()
    _Ended()
    AdlibUnRegister("_Started")
    EndIf
    EndFunc ;==>_Started
    Func _replaceStarted()
    Local $aStarted, $startedLine, $combineStarted
    For $i = 0 To _GUICtrlEdit_GetLineCount($Edit1) - 1
    $startedLine = _GUICtrlEdit_GetLine($Edit1, $i)
    $aStarted = StringRegExp($startedLine, "(\d{1,6})(\s\W\sGame message: Match started!)", 3)
    If Not @error Then
    $combineStarted = $aStarted[0] & $aStarted[1]
    If $startedLine = $combineStarted Then
    GUICtrlSetData($Edit1, StringReplace(GUICtrlRead($Edit1), _GUICtrlEdit_GetLine($Edit1, $i) & @CRLF, $aStarted[0] & " - Line deleted by GITM Tool" & @CRLF))
    _GUICtrlEdit_LineScroll($Edit1, 0, _GUICtrlEdit_GetLineCount($Edit1))
    EndIf
    EndIf
    Next
    EndFunc ;==>_replaceStarted
    Func _Ended()
    Local $readCon, $aEnded
    AdlibRegister("_Ended")
    $readCon = GUICtrlRead($Edit1)
    $aEnded = StringRegExp($readCon , "message:\s(Match\sended\!)")
    If $aEnded = True Then
    _replaceEnded()
    AdlibUnRegister("_sendMessages")
    AdlibUnRegister("_Ended")
    Return AdlibRegister("_Started")
    EndIf
    EndFunc ;==>_Ended
    Func _replaceEnded()
    Local $aEnded, $endedLine, $combineEnded
    For $i = 0 To _GUICtrlEdit_GetLineCount($Edit1) - 1
    $endedLine = _GUICtrlEdit_GetLine($Edit1, $i)
    $aEnded = StringRegExp($endedLine , "(\d{1,6})(\s\W\sGame message: Match ended!)", 3)
    If Not @error Then
    $combineEnded = $aEnded[0] & $aEnded[1]
    If $endedLine = $combineEnded Then
    GUICtrlSetData($Edit1, StringReplace(GUICtrlRead($Edit1), _GUICtrlEdit_GetLine($Edit1, $i) & @CRLF, $aEnded[0] & " - Line deleted by GITM Tool" & @CRLF))
    _GUICtrlEdit_LineScroll($Edit1, 0, _GUICtrlEdit_GetLineCount($Edit1))
    EndIf
    EndIf
    Next
    EndFunc ;==>_replaceEnded
    Func _sendMessages()
    Local $readInput3, $readInput6
    AdlibRegister("sendMessages", GUICtrlRead($Combo1)) ;$Combo1, hier kann der User auswählen in welchen Zeitabständen die Nachricht gesended wird. zbsp. 1 min, 2min...etc....
    $readInput3 = GUICtrlRead($Input3)
    $readInput6 = GUICtrlRead($Input6)
    ControlSend("C:\Program Files (x86)\Ubisoft\Far Cry 2\bin\FC2ServerLauncher.exe", "", "", "say " & $readInput3 & @CRLF)
    ControlSend("C:\Program Files (x86)\Ubisoft\Far Cry 2\bin\FC2ServerLauncher.exe", "", "", "say " & $readInput6 & @CRLF)

    [/autoit]


    Muss noch lernen den Code zu kommentieren...
    Ich habe noch ne andere Lösung die geht über die Log-Datei....

    2 Mal editiert, zuletzt von VinceA (26. Oktober 2013 um 01:35)

  • [autoit]

    AdlibRegister("_Messages", 60000)

    [/autoit][autoit][/autoit][autoit]

    Func _Messages()
    Local $readCon, $aStarted, $aEnded, $readInput

    [/autoit][autoit][/autoit][autoit]

    $readCon = GUICtrlRead($Edit1, "")
    $aStarted = StringRegExp($readCon, "message:\s(Match\sstarted\!)")
    $aEnded = StringRegExp($readCon, "message:\s(Match\sended\!)")
    If $aStarted = True Then
    $readInput = GUICtrlRead($Input3)
    ControlSend("C:\Program Files (x86)\Ubisoft\Far Cry 2\bin\FC2ServerLauncher.exe", "", "", "say " & $readInput & @CRLF)
    If $aEnded = True Then
    AdlibUnRegister("_Messages")
    EndIf
    EndIf
    EndFunc ;==>_Messages

    [/autoit]

    Also das dein Programm eine Endlos-Schleife oben benötigt ist ja bekannt, ich möchte hier auf deine Funktion eingehen.

    Es sind 3 Fehler enthalten warum die Funktion nicht wie gewünscht ablaufen kann.

    Der 1. Fehler ist die Variable $aStarted, im ersten Durchlauf bekommt sie den Wert TRUE, weil StringRegExp ja in der $readCon "started" findet.
    Die Variable $aEnded bekommt dagegen als Wert FALSE, weil in $readCon ja "started" steht.

    Nun kommt die Abfrage der Variable $aStarted, diese IF-Abfrage wird ausgeführt wenn $aStartet gleich TRUE ist, das Problem ist aber nun, folgendes.

    Wird nun deine Funktion das 2. mal aufgerufen, dann kann die IF-Abfrage nicht ausgeführt werden, weil die Variable $aStarted diesmal auf FALSE steht, den die Variable $readCon kann ja nun auf "sended" stehen, so kommen wir nun auch direkt zum 2. Fehler deiner Funktion.

    Die 2. IF-Abfrage ist in der 1. IF-Abfrage eingebettet, somit wird die 2. IF-Abfrage überhaupt nicht geprüft da die 1. IF-Abfrage ja nicht zutreffend ist.

    Du musst die 2. IF-Abfrage aus der 1. IF-Abfrage raus nehmen, dann erfolgt auch hier die IF-Abfrage.

    Kommen wir nun zum 3. Fehler, sofern ich dein Programm Wunsch verstanden habe.

    Mit dem Befehl AdlibUnRegister wird deine Funktion wieder abgemeldet, möchtest du nun aber im weiteren Verlauf es so haben das diese Funktion wieder aufgerufen wird, dann muss du im Hauptprogramm einen entsprechenden Programm-Code hinzufügen der dann deine Funktion wieder über AdlibRegister aktiviert.