1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Crys

Beiträge von Crys

  • CMD Ausgabe zuverlässig erfassen

    • Crys
    • 19. Januar 2018 um 13:33
    Zitat von Bitnugger

    Funktioniert bedeutet bei mir, das ein Script zumindest in 99,8% aller Fälle die von mir erwarteten Ergebnisse liefert... [...]

    Wie beschrieben hat es ja nur bei einer von 150 Dateien nicht geklappt, also liegt meine Quote von 99,3% deutlich unter deiner "Funktioniert"-Quote ;)

    Aber sorry, ich weiß leider nicht was du mir mit dem Beispiel aufzeigen möchtest.

    @ Oscar:

    Vielen Dank, dein Skript ist zwar groß, hat aber das Exif-Auslesen viel einfacher gemacht und zudem auch schneller!

  • CMD Ausgabe zuverlässig erfassen

    • Crys
    • 18. Januar 2018 um 19:03

    Danke! Kannst du mir aber vielleicht sagen, wie du auf die Hex-Werte (0x010E, ...) bei dem DllStructGetData() gekommen bist? Weil dann könnte ich dein Skript für meine Zwecke provisorisch erweitern.

  • CMD Ausgabe zuverlässig erfassen

    • Crys
    • 18. Januar 2018 um 17:52
    Zitat von Oscar

    Falls Dir da noch Exifdaten fehlen, melde Dich einfach. Ich schaue dann mal, was sich machen lässt.

    Danke :)

    Ich wäre an den verschieden GPS-Daten interessiert:

    GPSAltitude

    GPSImgDirection

    GPSLatitude

    GPSLongitude


    Eine Beispieldatei: https://anonfile.com/PbGdzcdcbf/Hintergrund-01-170803.jpg

  • CMD Ausgabe zuverlässig erfassen

    • Crys
    • 18. Januar 2018 um 17:47

    Danke, das hatte ich auch gesehen, nur leider sind alle relevanten Daten, wie die "GPSImgDirection" nicht vorhanden. Und ich weiß nicht wie man das in der kleinen Funktion mit einpacken könnte :|

  • CMD Ausgabe zuverlässig erfassen

    • Crys
    • 18. Januar 2018 um 17:27

    Danke für deine schnelle Antwort.

    Zitat von alpines

    Du könntest die EXIF-Daten direkt in AutoIt auslesen, so sparst du dir den Umweg über eine externe Exe.

    Liebend gerne, aber ich habe dazu keine echte Lösung gefunden. Hast du da einen Ansatz für mich?

    Mit dem Datei schreiben probiere ich das mal. Das wird aber sicher an der Performance zerren!?

  • CMD Ausgabe zuverlässig erfassen

    • Crys
    • 18. Januar 2018 um 16:21

    Servus Zusammen,

    schaue nach langer Abstinenz mal wieder hier vorbei :S

    Ich möchte Ausgabe eines CMD-Befehls zuverlässig erfassen, im konkretten geht es dabei EXIF-Werte eines Bildes mittels des ImageMagicks Moduls zu bestimmen.

    Code
    For $y = 1 To $CmdLine[0]    
        CmdOutputTest($CmdLine[$y])
    next
    
    Func CmdOutputTest($sPfadAusgabe)
        ; EXIF auslesen
        $sExif = "GPSImgDirection"
        $sCommand1 = 'identify -format %[exif:' & $sExif & '] "' & $sPfadAusgabe & '"'
        
        $sOutput = CmdOutput($sCommand)
        
        if $sWinkel = false then
            ; MsgBox(0, "Keine Richtungsangabe vorhanden", $sPfadAusgabe)
            $iWinkel = false
            
        else
            $aOutput = StringSplit($sWinkel, "/")
        
            if UBound($aWinkel) <> 3 then
                ; Fehlermeldung von CMD
                _ArrayDisplay($aWinkel, $sPfadAusgabe)
                MsgBox(0, "Winkel", $sWinkel)
                ; exit
            
            else
                $iWinkel = Round($aOutput[1] / $aOutput[2], 0)
                MsgBox(0, "Winkel", $iWinkel)
            endif
        endif
    EndFunc
    
    Func CmdOutput($sCommand)
        If StringLeft($sCommand, 1) = " " Then $sCommand = " " & $sCommand 
    
        Local $nPid = Run(@Comspec & " /c" & $sCommand, "", @SW_Hide, 8) , $sRet = "" 
        If @Error then Return "ERROR:" & @ERROR
        ProcessWait($nPid)
        While 1 
            $sRet &= StdoutRead($nPID)
            If @error Or(Not ProcessExists($nPid) ) Then ExitLoop 
        WEnd 
        
        if StringInStr($sRet, "%[exif:") then Return false
        if StringLen($sRet) = 0 then Return "ERROR: -leer-"
        
        Return $sRet
    EndFunc
    Alles anzeigen

    Der Code ist nicht schön, aber funktioniert ... zumindest meistens. Ich lasse ca. 150 Bilder im Stapel ausführen und immer hängt es bei einem Bild ... mal Bild 14, 52, 98, 143 ... ganz beliebig ohne Schema, auch wenn ich immer das selbe Bild kopiert verwende.

    Irgendwie spuckt die CmdOutput Fkt. manchmal ein leeres Ergebnis aus, mal einen Fehler, das eine Datei nicht gefunden wurde, mal wird das Ergebnis vom Bild davor ausgegeben ?(

    Wie mache ich das besser und vor allem richtig? Das die Funktion immer funktioniert?

    Vielen Dank ;)

  • Anführungszeichen auskommentieren

    • Crys
    • 22. September 2013 um 18:06

    Vielen Dank!

    Das

    [autoit]

    $s2 = 'Das ist ein ''Text'' mit Selbstmaskierung'

    [/autoit]

    geht in Bezug auf CMD nicht, der Rest aber.

    :)

  • Anführungszeichen auskommentieren

    • Crys
    • 22. September 2013 um 13:08

    Und zwar möchte ich Anführungszeichen in AutoIt und CMD auskommentieren, da ich mehr als zwei Arten benötige.

    Konkretes cmd Beispiel:

    Code
    convert datei.jpg -gravity NorthEast -font Calibri -pointsize 25 -fill black -draw "text 0,0 'Text'" ausgabe.jpg


    Damit bearbeitet man Bilder mit ImageMagick: http://www.imagemagick.org/Usage/fonts/
    Man muss um den "Text" Anführungszeichen setzten, damit man auch Leerzeichen verwenden kann.
    Und um die Parameter von "-draw", also das "text 0,0 'Text'", muss man (meines erachtens nach) auch Anführungszeichen setzten, damit das auch funktioniert.
    Jetzt schon schon zwei Arten von Anführungszeichen im Spiel ...

    In AutoIt kann man das nur noch so umsetzten:

    [autoit]

    $sText = "'Text'"
    RunWait(@ComSpec & ' /c convert datei.jpg -gravity NorthEast -font Calibri -pointsize 25 -fill black -draw "text 0,0 ' & $sText & '" ausgabe.jpg')

    [/autoit]


    So kann man um "Text" Anführungszeichen setzten und die selben auch für die AutoIt Zeile verwenden.

    Jetzt möchte ich aber als Text z.B. das verwenden: "AutoIt" ist eine Skriptsprache
    (Also mit Anführungszeichen um AutoIt.)
    Ich habe keine Ahnung wie ich das jetzt umsetzten könnte.

    Könnt irhh mir weiter helfen?

    Danke! :)

  • Wie WildCards in AutoIt?

    • Crys
    • 9. Juli 2013 um 22:24

    Wie werden WildCards in AutoIt angegeben?

    Konkret:
    Ich möchte mit "_FileListToArray()" einen Ordner durchsuchen, aber bestimmte Datei Typen außen vor lassen.
    Sprich alle Dateien (*.*), bis auf einige (*.xyz; *.yz; ...) im Array haben.

    In der Beschreibung steht: "Für mehr Details ist in der Autoit3-Hilfedatei nach dem Stichwort "WildCards" zu suchen.", als keinen einzigen Treffer bringt ...

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Bilder

    • autoit_wildcard.png
      • 6,34 kB
      • 236 × 201
  • WinHttp Abfrage gibt nach 30s nichts zurück

    • Crys
    • 3. Mai 2012 um 23:55

    Vielen Dank! Das ist es. :thumbup:

    Zitat von progandy

    Eigentlich sollte der Server alle 10-20s einen HTTP 102 Processing Header senden, wenn er noch keine Daten liefert.

    Hm, wüsste nicht wie ich das einfach per php umsetzten könnte ...

  • WinHttp Abfrage gibt nach 30s nichts zurück

    • Crys
    • 3. Mai 2012 um 21:48

    Ich greife mit der WinHTTP.au3 UDF auf ein paar API zu und lange Dateien runter (bei denen man sich per _POST anmelden muss).
    Nur habe ich festgestellt, dass wenn der Seitenaufbau mehr als 30s benötigt gar kein Inhalt zurück gegeben wird!

    Ich habe das gelogt: alle Verbindungen die <30s sind funktionieren, alle die >=30s sind funktionieren nicht.
    Genauer, wenn _WinHttpSendRequest() 30s aktiv ist, kommt kein Inhalt an. Ein Header wird gesendet.

    Wieso wird die Verbindung nach 30s abgebrochen?
    Wie kann ich das verhindern?

    Meine Beispiel Funktion
    [autoit]

    #include "WinHTTP.au3"

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

    $sIhnhalt = crys_post("http://www.example.com/grosse_datei.zip", "name=name&pw=pw")

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

    Func crys_post($sLink, $sPost = "")
    Local $data

    $sLink = StringReplace($sLink, "http://", "")
    ;if StringRight($sLink, 1) = "/" then $sLink = StringTrimRight($sLink, 1)
    $aLink = StringSplit($sLink, "/", 1+2)
    $sLink = $aLink[0]
    $sLinkPfad = "/" & _ArrayToString($aLink, "/", 1)
    ;MsgBox(0, "URL", $sLink & @CRLF & $sLinkPfad & @CRLF & $sPost)

    $hOpen = _WinHttpOpen()
    $hConnect = _WinHttpConnect($hOpen, $sLink)

    if $sPost = "" then
    $hRequest = _WinHttpOpenRequest($hConnect, "GET", $sLinkPfad, "HTTP/1.1")
    else
    $hRequest = _WinHttpOpenRequest($hConnect, "POST", $sLinkPfad, "HTTP/1.1")
    endif

    _WinHttpSendRequest($hRequest, "Content-Type: application/x-www-form-urlencoded" & @CRLF, $sPost)
    ;_WinHttpSendRequest($hRequest, "Content-Type: multi-part/form-data" & @CRLF, $sPost)
    if @error then MsgBox(16, "Fehler", "_WinHttpSendRequest()")
    _WinHttpReceiveResponse($hRequest)

    ;$header = _WinHttpQueryHeaders($hRequest)
    ;MsgBox(0, "Header", $header)
    If _WinHttpQueryDataAvailable($hRequest) Then
    Do
    $data &= _WinHttpReadData($hRequest)
    Until @error
    ;MsgBox(0, "Daten", $data)
    EndIf

    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)

    return $data
    EndFunc

    [/autoit]
  • Daten an anderen PC im Netzwerk senden

    • Crys
    • 2. Mai 2012 um 18:47

    ja, brauche ich das?
    Ich möchte ja keine Dateien versenden ...

    Ich habe das jetzt so gelöst, indem ich Server und Client wieder getrennt habe, weiß nicht wieso ich das so kompliziert machen wollte:

    Client
    [autoit]

    #include "funktionen.au3"

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

    Opt("TrayAutoPause", 0) ; Keine Pause, bei Klick
    Opt("TrayIconDebug", 1) ; zeige Debug

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

    $sTitel = "Client"

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

    ;MsgBox(0, $sTitel, "Client startet Empfangen.")
    $iSocket = empfangen_start($iIpServer, $iPort)
    if $iSocket = false then
    MsgBox(16, $sTitel, "Empfangen nicht erfolgreich gestartet." & @CRLF & "Vielleicht ist schon eine Client-Instanz offen?")
    exit
    endif

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

    ;MsgBox(0, $sTitel, "Warte auf Nachricht von Server.")
    $iSocket = empfangen_test($iSocket)
    $sEmpfangen = empfangen($iSocket)
    if $sEmpfangen <> false then
    ;MsgBox(0, $sTitel, "Nachricht wurde erfolgreich empfangen.")

    $bBeenden = beenden($iSocket)
    if $bBeenden = false then
    MsgBox(16, $sTitel, "Fehler beim TCP-Empfangen beenden.")
    exit
    endif

    ;MsgBox(0, $sTitel, "Testen ob Server noch an.")
    $cSocket = senden_start($iIpClient, $iPort)
    if $cSocket <> false then
    ;MsgBox(0, $sTitel, "Client ist an.")
    $sNachricht = '"' & $sEmpfangen & '" plus ' & @CRLF & "der Senf vom Clienten."

    $iBytes = senden($cSocket, $sNachricht)
    if $iBytes <> false then
    ;MsgBox(0, $sTitel, "Nachricht wurde gesendet.")
    else
    MsgBox(16, $sTitel, "Nachricht kontne nicht gesendet werden.")
    exit
    endif

    $bBeenden = beenden($cSocket)
    if $bBeenden = false then
    MsgBox(16, $sTitel, "Fehler beim TCP-Empfangen beenden.")
    exit
    endif
    else
    MsgBox(16, $sTitel, "Server ist nicht mehr an.")
    exit
    endif
    else
    MsgBox(16, $sTitel, "Es wurde keine Nachricht empfangen.")
    exit
    endif

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

    MsgBox(0, $sTitel, $sEmpfangen)

    [/autoit]
    Server
    [autoit]

    #include "funktionen.au3"

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

    Opt("TrayAutoPause", 0) ; Keine Pause, bei Klick
    Opt("TrayIconDebug", 1) ; zeige Debug

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

    $sTitel = "Server"

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

    ;MsgBox(0, $sTitel, "Testen ob Client an.")
    $cSocket = senden_start($iIpClient, $iPort)
    if $cSocket <> false then
    ;MsgBox(0, $sTitel, "Client ist an.")
    $sNachricht = "Das ist die Testnachricht vom Server."

    $iBytes = senden($cSocket, $sNachricht)
    if $iBytes <> false then
    ;MsgBox(0, $sTitel, "Nachricht wurde gesendet.")
    else
    MsgBox(16, $sTitel, "Nachricht kontne nicht gesendet werden.")
    exit
    endif

    $bBeenden = beenden($cSocket)
    if $bBeenden = false then
    MsgBox(16, $sTitel, "Fehler beim TCP-Senden beenden.")
    exit
    endif

    $iSocket = empfangen_start($iIpClient, $iPort)
    if $iSocket = false then
    MsgBox(16, $sTitel, "Empfangen nicht erfolgreich gestartet")
    exit
    endif

    $iSocket = empfangen_test($iSocket)
    $sEmpfangen = empfangen($iSocket)
    if $sEmpfangen <> false then
    ;MsgBox(0, $sTitel, "Nachricht wurde erfolgreich empfangen.")
    else
    MsgBox(16, $sTitel, "Es wurde keine Nachricht empfangen.")
    exit
    endif

    $bBeenden = beenden($iSocket)
    if $bBeenden = false then
    MsgBox(16, $sTitel, "Fehler beim TCP-Empfangen beenden.")
    exit
    endif
    else
    MsgBox(16, $sTitel, "Client ist nicht an.")
    exit
    endif

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

    MsgBox(0, $sTitel, $sEmpfangen)

    [/autoit]
    Funktionen
    [autoit]


    $iIpClient = "192.168.1.60"
    $iIpServer = "192.168.1.60"
    $iPort = "33456"

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

    ; Starten vom TCP empfangen
    func empfangen_start($iIp = "127.0.0.1", $iPort = "33456")
    TCPStartup()
    if @error then return false

    $iSocket = TCPListen($iIp, $iPort)
    if @error then return false

    return $iSocket
    endfunc

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

    ; Testen ob das gegebnüber bereit
    func empfangen_test($iSocket, $iInterval = 1)
    local $iTimer

    Do
    ;if TimerDiff($iTimer) > $iInterval*1000 then
    $cSocket = TCPAccept($iSocket)
    ;$iTimer = TimerInit()
    ;endif
    Until $cSocket <> -1
    if @error then return false

    return $cSocket
    endfunc

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

    ; Warten bis das gegenüber eine Nachricht ausgibt
    func empfangen($cSocket, $iMax = 2048, $bBin = 0)
    Do
    $sInhalt = TCPRecv($cSocket, $iMax, $bBin)
    Until $sInhalt <> ""
    if @error then return false

    return $sInhalt
    endfunc

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

    ; Beenden der TCP Sende- oder Empfangs- Verbindung
    func beenden($cSocket)
    $bSocket = TCPCloseSocket($cSocket)
    if @error then return false

    $bSocket = TCPShutdown()
    if @error then return false

    return true
    endfunc

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

    ; Starten vom TCP senden
    func senden_start($iIp = "127.0.0.1", $iPort = "33456")
    TCPStartup()
    if @error then return false

    $cSocket = TCPConnect($iIp, $iPort)
    if @error then return false

    return $cSocket
    endfunc

    ; Eine Nachricht per TCP senden
    func senden($cSocket, $sSenden)
    $iBytes = TCPSend($cSocket, $sSenden)
    if @error then return false

    return $iBytes
    endfunc

    [/autoit]


    Ich habe irgendwo einmal gelesen, dass TCPAccept() nach einer gewissen Zeit aufhört, nichts mehr macht, dass man es nur eine bestimmt Anzahl aufrufen kann. Konnte sowas bei mir noch nicht feststellen ...

  • Daten an anderen PC im Netzwerk senden

    • Crys
    • 2. Mai 2012 um 16:32

    Ich möchte Daten von PC A, nach PC B senden ... ich denke das geht am besten per TCP, denn dass soll nur im Intranet geschehen.

    Ich habe mal aus den Beispielen von TCPRecv() den Server und TCPSend() den Client ein Programm geschrieben, dass senden und verschicken kann:

    Fkt. zum senden und empfangen von TCP
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #include <GuiButton.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <Misc.au3>

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

    Opt('MustDeclareVars', 1)
    Opt("TrayAutoPause", 0) ; Keine Pause, bei Klick
    Opt("TrayIconDebug", 1) ; zeige Debug

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

    Example()

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

    func Example()
    ; Richte einige wiederverwendbare Informationen ein.
    ; Richte deine öffentliche IP Adresse (@IPAddress1) hier ein.
    ;local $IPADDRESS = TCPNameToIP("chrisx312")

    local $szIPADDRESS = @IPAddress2
    local $nPORT = 8763
    local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted, $input, $knopf
    local $msg, $recv, $SendenSocket, $IPADDRESS = "192.168.1.60", $IP_Accepted, $iTimerC, $iTimerS, $iTimerDiff = 5*1000

    $IPADDRESS = InputBox("andere IP Adresse", "andere IP Adresse:", $IPADDRESS)
    if @error or $IPADDRESS = "" then return false

    ; Startet den TCP Service
    ;==============================================
    TCPStartup()

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

    ; Erstellt einen lauschenden Port.
    ; Benutzt deine IP Adresse und den Port 33891. (Oben angegeben)
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

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

    ; Wenn die Socketerstellung fehl schlägt, dann wird das Programm beendet.
    if $MainSocket = -1 then
    MsgBox(4112, "Fehler", "Wenn die Socketerstellung fehl schlägt, dann wird das Programm beendet: " & @error)
    exit
    endif

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

    ; Erstellt eine GUI für Messages.
    ;==============================================
    $GOOEY = GUICreate(@ComputerName & " (IP: " & $szIPADDRESS & ")", 300, 230)
    $edit = GUICtrlCreateEdit("", 10, 10, 280, 180, $ES_READONLY)
    $input = GUICtrlCreateInput("", 10, 200, 210, 20)
    $knopf = GUICtrlCreateButton("senden", 230, 200, 60, 20)
    GUISetState()

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

    ; Initialisiert eine Variable um eine Verbindung anzugeben
    ;==============================================
    $SendenSocket = TCPConnect($IPADDRESS, $nPORT)
    if $SendenSocket <> -1 then
    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden gestartet" & @CRLF & GUICtrlRead($edit))
    else
    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden nicht gestartet" & @CRLF & GUICtrlRead($edit))
    endif

    $ConnectedSocket = TCPAccept($MainSocket)
    if $ConnectedSocket <> -1 then
    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen gestartet" & @CRLF & GUICtrlRead($edit))
    else
    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen nicht gestartet" & @CRLF & GUICtrlRead($edit))
    endif

    $iTimerC = $iTimerS = TimerInit()

    While 1
    $msg = GUIGetMsg()
    ;MsgBox(0, "", TimerDiff($iTimer) & "-" & $iTimer+$iTimerDiff & " = " & TimerDiff($iTimer) - ($iTimer+$iTimerDiff))
    if $SendenSocket = -1 and TimerDiff($iTimerS) > $iTimerDiff then
    $SendenSocket = TCPConnect($IPADDRESS, $nPORT)
    $iTimerS = TimerInit()
    if $SendenSocket <> -1 then
    ; Bekommt die IP des verbundenen Clients
    ;$IP_Accepted = SocketToIP($SendenSocket)

    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden gestartet" & @CRLF & GUICtrlRead($edit))
    else
    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden nicht gestartet" & @CRLF & GUICtrlRead($edit))
    endif
    endif

    ; Wartet auf und akzeptiert eine Verbindung
    ;==============================================
    if $ConnectedSocket = -1 and TimerDiff($iTimerC) > $iTimerDiff then

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

    $ConnectedSocket = TCPAccept($MainSocket)
    $iTimerC = TimerInit()
    if $ConnectedSocket <> -1 then
    ; Bekommt die IP des verbundenen Clients
    ;$szIP_Accepted = SocketToIP($ConnectedSocket)

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

    ; GUI Message Schleife
    ;==============================================
    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen gestartet" & @CRLF & GUICtrlRead($edit))
    else
    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen nicht gestartet" & @CRLF & GUICtrlRead($edit))
    endif
    elseif $ConnectedSocket <> -1 then

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

    ; Versucht Daten zu empfangen, bis zu 2048 bytes
    ;----------------------------------------------------------------
    $recv = TCPRecv($ConnectedSocket, 2048)

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

    ; Wenn der Empfang mit @error fehlschlägt, dann hat sich der Socket getrennt.
    ;----------------------------------------------------------------
    if @error then
    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen beendet" & @CRLF & GUICtrlRead($edit))
    $ConnectedSocket = -1
    ;exitloop
    endif

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

    ; Aktualisiert das Input-Control mit dem, was wir empfangen haben.
    ;----------------------------------------------------------------
    if $recv <> "" then GUICtrlSetData($edit, $IPADDRESS & " (sendet) " & $recv & @CRLF & GUICtrlRead($edit))
    endif

    ; GUI beendet
    ;--------------------
    if $msg = $GUI_EVENT_CLOSE then exitloop

    ; Nachricht senden
    if $msg = $knopf or (_IsPressed("0D") and WinActive($GOOEY)) then
    ; Wir sollten Daten in $szData haben... Lasst uns versuchen, sie durch unseren verbundenen Socket zu versenden.
    TCPSend($SendenSocket, GUICtrlRead($input))

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

    ; Wenn das Senden mit @error fehlgeschlagen ist, dann ist der Socket getrennt.
    ;----------------------------------------------------------------
    if @error then
    GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden beendet/nicht gestartet" & @CRLF & GUICtrlRead($edit))
    $SendenSocket = -1
    ;exitloop
    else
    if GUICtrlRead($input) <> "" then
    GUICtrlSetData($edit, $szIPADDRESS & " (sendet) " & GUICtrlRead($input) & @CRLF & GUICtrlRead($edit))
    GUICtrlSetData($input, "")
    endif
    endif
    endif
    wend

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

    if $ConnectedSocket <> -1 then TCPCloseSocket($ConnectedSocket)
    if $SendenSocket <> -1 then TCPCloseSocket($SendenSocket)

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

    TCPShutdown()
    endfunc ;==>Example

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

    ; Funktion um die IP Adresse eines verbundenen Sockets wiederzugeben.
    ;----------------------------------------------------------------------
    func SocketToIP($SHOCKET)
    local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    if Not @error And $aRet[0] = 0 then
    $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
    if Not @error then $aRet = $aRet[0]
    else
    $aRet = 0
    endif

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

    $sockaddr = 0

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

    Return $aRet
    endfunc ;==>SocketToIP

    [/autoit]


    Es funktioniert auch soweit gut!
    Man kann Nachrichten versehen, mehr nicht.
    Kann man das noch vereinfachen?

    Das obige ist nur ein Test, ich möchte das Programm umschreiben, sodass PC A einen String (ca. 5kb) an PC B sendet. PC B kontrolliert diesen String und gibt eine kurze Antwort (8bytes) an PC A.
    PC A läuft immer, PC B ist nicht immer an. PC A soll prüfen ob PC B an ist, wenn ja sendet es den String, falls nein eben nicht.
    Das obige Skript möchte ich in der Form im schreiben. Macht das Sinn?
    Gibt es noch eine bessere Möglichkeit?

  • Per TrayIcon Programm abbechen

    • Crys
    • 2. Mai 2012 um 11:03

    Ok, also TrayIcon als extra Prozess, dass den Hauptprozess schließen kann.

  • Multitasking ist gefragt

    • Crys
    • 2. Mai 2012 um 10:43

    Danke, so ähnlich habe ich es bereits umgesetzt.

    Ich komme da nicht weiter:

    Zitat von Crys

    Irgendwie wird das $bGeladen = true nicht von der AdlibRegister-Fkt. auf den Rest übertragen!?

    Beispiel Skript 2
    [autoit]

    #include <GuiConstantsEx.au3>
    global $bLadeEtwas, $bGeladen = false

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

    lade_etwas()

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

    GUICreate("titel", -1, -1, 100, 100)
    $b_start = GUICtrlCreateButton("Starten", 10, 10, 80, 30)

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

    AdlibRegister("etwas_geladen", 500)
    AdlibRegister("frage_ab", 10*1000)
    gui()

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

    ; die Funktionen

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

    func lade_etwas()
    ; etwas das ca. 30s am Stück läuft, Ergebniss gibt es erst, wenn es fertig ist
    $bLadeEtwas = true
    ;sleep(3000)
    endfunc

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

    func etwas_geladen()
    ; testen ob lade_etwas() schon geladen hat
    if $bLadeEtwas = true and $bGeladen = false then
    ; ...
    MsgBox(0, "", "etwas_geladen setze true")
    $bGeladen = true
    endif
    ;MsgBox(0, "", "etwas_geladen")
    endfunc

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

    func sende_etwas()
    ; einfach etwas senden oder speichern
    endfunc

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

    func frage_ab()
    ; frage etwas ab
    MsgBox(0, "", "frage_ab!")
    endfunc

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

    func gui()
    local $bGeladen = false, $iTimer = TimerInit(), $iZeit = TimerInit(), $iZeit2 = 0

    GUISetState(@SW_SHOW)

    while true
    switch GUIGetMsg()
    case $GUI_EVENT_CLOSE
    exit

    case $b_start
    if $bGeladen = true then
    sende_etwas()
    $bGeladen = false
    $iZeit2 = 0
    lade_etwas() ; neustarten
    MsgBox(0, "", "sende_etwas!")
    else
    MsgBox(0, "", "Tue nichts")
    endif
    endswitch

    if $bGeladen = true then
    ; neue Zeit setzen, wenn neues true
    if $iZeit2 = 0 then
    $iZeit2 = TimerDiff($iZeit)
    MsgBox(0, "", "etwas_geladen = true")

    ; wenn die Zeit verstrichen ist
    elseif $iZeit2+15*1000 < TimerDiff($iZeit) then
    $bGeladen = false
    $iZeit2 = 0
    MsgBox(0, "", "etwas_geladen = Zeit vorbei")
    lade_etwas() ; neustarten
    endif
    endif
    wend
    endfunc

    [/autoit]
    Alles anzeigen
  • Per TrayIcon Programm abbechen

    • Crys
    • 2. Mai 2012 um 10:35

    Pff, nein :P

    Mit dem sleep() habe ich ja simuliert, dass das Programm läuft und gerade nicht reagiert.
    Dann soll man mit "Beenden" auch das Programm abbrechen können!

    Selbst bei meinem sleep(200), beendet der das Programm erst nach 10-20s.
    Wenn ich das

    [autoit]

    if TrayItemGetState($exititem) = $TRAY_CHECKED then exit

    [/autoit]

    noch entferne, dann beendet er das Programm nie ...

  • Per TrayIcon Programm abbechen

    • Crys
    • 2. Mai 2012 um 01:16

    Ich möchte einen Knopf erzeugen, wie er auch im std. TrayMenü bei AutoIt Skripten ist.
    Du einen Klick soll ein Programm, egal was es gerade macht, abgebrochen werden.
    Nur klappt das nicht, wenn ich versuche das nachzubauen:

    [autoit]

    #Include <Constants.au3>

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

    Opt("TrayMenuMode", 1)

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

    $exititem = TrayCreateItem("Beenden")

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

    While 1
    if TrayItemGetState($exititem) = $TRAY_CHECKED then exit
    $msg = TrayGetMsg()
    Select
    Case $msg = $exititem
    ExitLoop
    EndSelect
    sleep(2*100)
    WEnd

    [/autoit]


    Es soll einfach durch einen Klickt auf ein Element im TrayMenü das Programm unverzüglich abgebrochen werden. Wie mache ich das?

  • Multitasking ist gefragt

    • Crys
    • 1. Mai 2012 um 18:28

    Irgendwie wird der $bGeladen = true nicht von der AdlibRegister-Fkt. auf den Rest übertragen!?

    Beispiel Skript 2
    [autoit]

    #include <GuiConstantsEx.au3>
    global $bLadeEtwas, $bGeladen = false

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

    lade_etwas()

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

    GUICreate("titel", -1, -1, 100, 100)
    $b_start = GUICtrlCreateButton("Starten", 10, 10, 80, 30)

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

    AdlibRegister("etwas_geladen", 500)
    AdlibRegister("frage_ab", 10*1000)
    gui()

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

    ; die Funktionen

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

    func lade_etwas()
    ; etwas das ca. 30s am Stück läuft, Ergebniss gibt es erst, wenn es fertig ist
    $bLadeEtwas = true
    ;sleep(3000)
    endfunc

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

    func etwas_geladen()
    ; testen ob lade_etwas() schon geladen hat
    if $bLadeEtwas = true and $bGeladen = false then
    ; ...
    MsgBox(0, "", "etwas_geladen setze true")
    $bGeladen = true
    endif
    ;MsgBox(0, "", "etwas_geladen")
    endfunc

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

    func sende_etwas()
    ; einfach etwas senden oder speichern
    endfunc

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

    func frage_ab()
    ; frage etwas ab
    MsgBox(0, "", "frage_ab!")
    endfunc

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

    func gui()
    local $bGeladen = false, $iTimer = TimerInit(), $iZeit = TimerInit(), $iZeit2 = 0

    GUISetState(@SW_SHOW)

    while true
    switch GUIGetMsg()
    case $GUI_EVENT_CLOSE
    exit

    case $b_start
    if $bGeladen = true then
    sende_etwas()
    $bGeladen = false
    $iZeit2 = 0
    lade_etwas() ; neustarten
    MsgBox(0, "", "sende_etwas!")
    else
    MsgBox(0, "", "Tue nichts")
    endif
    endswitch

    if $bGeladen = true then
    ; neue Zeit setzen, wenn neues true
    if $iZeit2 = 0 then
    $iZeit2 = TimerDiff($iZeit)
    MsgBox(0, "", "etwas_geladen = true")

    ; wenn die Zeit verstrichen ist
    elseif $iZeit2+15*1000 < TimerDiff($iZeit) then
    $bGeladen = false
    $iZeit2 = 0
    MsgBox(0, "", "etwas_geladen = Zeit vorbei")
    lade_etwas() ; neustarten
    endif
    endif
    wend
    endfunc

    [/autoit]
    Zitat von chesstiger

    .... Oder, wenn man "Platz sparen" will, mit Startparametern den Code ausführen zu lassen, wenn ihr wisst wie ich das meine. So kann man sich die zusätzliche Exe sparen, da man dann nur 1 Script hat ;)

    Hm, dass das Skript sich dann selbst noch einmal mit Startparameter öffnet, aber dann etwas ganz anderes macht.
    Also mit Parameter lade_etwas() ausführt und ohne Parameter GUI und den Rest ausführt!?
    Kann das nicht zu Problemen führen, wenn das selbe Programm zweimal aktiv ist?
    Die Idee ist aber echt gut :)

  • Multitasking ist gefragt

    • Crys
    • 1. Mai 2012 um 18:10

    So, jetzt läuft auch das Beispiel.

    Zitat von RedHead

    also die einfachste idee die mir jetzt so auf die schnelle eingefallen ist wäre, wenn du den teil in "lade_etwas()" einfach zu einer exe datei machst und die dann einfach startest. so wird der teil nur einmal kurz aufgerufen und läuft parallel zum hauptscript ;) ist jetzt natürlich nur so eine idee....keine ahnung ob das bei deinem programm gehen würde ;)

    Ja, würde gehen, hab ich ja auch als Möglichkeit schon in Betracht gezogen, aber das wird komplizierter, als wenn alles in einem Skript laufen würde ...

    Zitat von Nathax

    Ich würde AdlibRegister nehmen.

    Danke, das kann ich für etwas_geladen() und frage_ab() verwenden!

  • Multitasking ist gefragt

    • Crys
    • 1. Mai 2012 um 17:56

    Ich möchte eine Funktion ausführen (lade_etwas()), die eine längere Zeit (ca. 30s) läuft. Dabei soll das Skript aber weiter laufen.
    Wie mache ich das, ohne dass das Skript einfriert?

    Es wird immer getestet (etwas_geladen()) ob obige Funktion gestartet ist, dann soll man z.B. auf einen Knopf innerhalb von 15s drücken, damit etwas gesendet wird (sende_etwas()).
    Wenn die man den Knopf drückt oder die Zeit abläuft soll die oben genannte Funktion wieder gestartet werde.
    Dafür habe ich einen Timer verwendet, ist das soweit ok?

    Dann möchte ich noch, dass alle 10s etwas anderes abgefragt wird (frage_ab()).
    Das auch wieder mit einem Timer, macht das Sinn?

    Hier meine Beispiel Fkt.
    [autoit]

    #include <GuiConstantsEx.au3>
    global $bLadeEtwas

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

    lade_etwas()

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

    GUICreate("titel", -1, -1, 100, 100)
    $b_start = GUICtrlCreateButton("Starten", 10, 10, 80, 30)

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

    gui()

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

    ; die Funktionen

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

    func lade_etwas()
    ; etwas das ca. 30s am Stück läuft, Ergebniss gibt es erst, wenn es fertig ist
    $bLadeEtwas = true
    ;sleep(3000)
    endfunc

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

    func etwas_geladen()
    ; testen ob lade_etwas() schon geladen hat
    if $bLadeEtwas = true then
    return true
    else
    return false
    endif
    endfunc

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

    func sende_etwas()
    ; einfach etwas senden oder speichern
    endfunc

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

    func frage_ab()
    ; frage etwas ab
    endfunc

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

    func gui()
    local $bGeladen = false, $iTimer = TimerInit(), $iZeit = TimerInit(), $iZeit2 = 0

    GUISetState(@SW_SHOW)

    while true
    switch GUIGetMsg()
    case $GUI_EVENT_CLOSE
    exit

    case $b_start
    if $bGeladen = true then
    sende_etwas()
    $bGeladen = false
    $iZeit2 = 0
    lade_etwas() ; neustarten
    MsgBox(0, "", "sende_etwas!")
    else
    MsgBox(0, "", "Tue nichts")
    endif
    endswitch

    ; alle 10s etwas abfragen
    if Mod(TimerDiff($iTimer), 10*1000) < 1000 then
    ; kleiner als 100, weil man nie genau die Milisekunde trifft
    frage_ab()
    endif

    ; wenn etwas_geladen() = false testen, bis true
    if $bGeladen = false then
    $bGeladen = etwas_geladen()
    endif

    if $bGeladen = true then
    ; neue Zeit setzen, wenn neues true
    if $iZeit2 = 0 then
    $iZeit2 = TimerDiff($iZeit)
    MsgBox(0, "", "etwas_geladen = true")

    ; wenn die Zeit verstrichen ist
    elseif $iZeit2+15*1000 < TimerDiff($iZeit) then
    $bGeladen = false
    $iZeit2 = 0
    MsgBox(0, "", "etwas_geladen = Zeit vorbei")
    lade_etwas() ; neustarten
    endif
    endif
    wend
    endfunc

    [/autoit]

    Mir geht es vor allem um die Fkt. lade_etwas(), die lange etwas ladet (Zeit ist dynamisch).
    Ich habe auch schon überlegt ob das ein anders Skript ausführt und an dieses, wenn fertig, das Ergebnis übergibt!?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™