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. Lambdax

Beiträge von Lambdax

  • TCPNameToIP Problem

    • Lambdax
    • 16. Februar 2022 um 14:05
    Zitat von Moombas

    PAck mal "www." davor :)

    Oh wow, das war jetzt wirklich eine Einfache lösung. Und schon funktioniert wieder jede Webseite. Dankeschön!

  • TCPNameToIP Problem

    • Lambdax
    • 16. Februar 2022 um 13:31

    Ich arbeite an einem HTTP/S Proxy als Beispiel für eine dahinter liegende UDF (kann man hier schon finden https://github.com/OfficialLambda…p_s%20proxy.au3).

    Es gibt noch ein zwei Probleme. Eines davon ist das TCPNameToIP nicht die IP zurückgibt zu der der Proxy sich verbinden sollte um die Browser frage weiterzuleiten.

    Beispiel: unwetterzentrale.de

    Der Browser verbindet sich, laut Wireshark, zur IP: 54.72.242.117

    Aber TCPNameToIP gibt diese zurück: 80.92.65.188

    Verbindet man sich zu 80.92.65.188 dann erhält man, egal was man sendet, ein "Bad Request".

    Bei DNSChecker (https://dnschecker.org/all-dns-record…=ALL&dns=google) findet sich die IP 54.72.242.117 im MX bereich wieder. Jetzt frage ich mich wie ich diese per Autoit auslotet. Weiß das jemand?

  • Mehrfachbedingung vernünftig gestalten

    • Lambdax
    • 11. Februar 2022 um 10:05

    Genau die Variante die ich da gepostet habe macht nur sinn wenn man prüfen will ob alle der String Variablen Leer sind. Ansonsten, wie schon ausgeführt wurde, wird autoit sowas wie ein Bool False in String "False" umwandeln was buggs hervorrufen könnte.

  • Mehrfachbedingung vernünftig gestalten

    • Lambdax
    • 10. Februar 2022 um 21:17
    Code
    if Not ($sA & $sB & $sC & $sD) Then

    ginge auch. Lief bei mir am schnellsten

    Code
    Local $n = 1e5, $hTimer = 0, $nTime = 0
    
    Local $sA = ""
    Local $sB = ""
    Local $sC = ""
    Local $sD = ""
    
    
    $hTimer = TimerInit()
    For $i = 1 To $n
        If $sA = "" And $sB = "" And $sC = "" And $sD = "" Then
        EndIf
    Next
    $nTime = TimerDiff($hTimer)
    ConsoleWrite('If x = "" took: ' & $nTime & " ms" & @CRLF)
    
    $hTimer = TimerInit()
    For $i = 1 to $n
        if $sA == "" And $sB == "" And $sC == "" And $sD == "" Then
        EndIf
    Next
    $nTime = TimerDiff($hTimer)
    ConsoleWrite('If x == "" took: ' & $nTime & " ms" & @CRLF)
    
    $hTimer = TimerInit()
    For $i = 1 to $n
        if BitAND($sA == "", $sB == "", $sC == "", $sD == "") Then
        EndIf
    Next
    $nTime = TimerDiff($hTimer)
    ConsoleWrite("If BitAnd() took: " & $nTime & " ms" & @CRLF)
    
    $hTimer = TimerInit()
    For $i = 1 to $n
        if ($sA & $sB & $sC & $sD) = "" Then
        EndIf
    Next
    $nTime = TimerDiff($hTimer)
    ConsoleWrite('If (x & y) = "" took: ' & $nTime & " ms" & @CRLF)
    
    $hTimer = TimerInit()
    For $i = 1 to $n
        if ($sA & $sB & $sC & $sD) == "" Then
        EndIf
    Next
    $nTime = TimerDiff($hTimer)
    ConsoleWrite('If (x & y) == "" took: ' & $nTime & " ms" & @CRLF)
    
    $hTimer = TimerInit()
    For $i = 1 to $n
        if Not ($sA & $sB & $sC & $sD) Then
        EndIf
    Next
    $nTime = TimerDiff($hTimer)
    ConsoleWrite('If Not (x & y) took: ' & $nTime & " ms" & @CRLF)
    Alles anzeigen
    Code
    If x = "" took: 168.9001 ms
    If x == "" took: 142.9745 ms
    If BitAnd() took: 192.7787 ms
    If (x & y) = "" took: 88.5645 ms
    If (x & y) == "" took: 82.4627 ms
    If Not (x & y) took: 80.4725 ms

    Und mit der Autoit Beta

    Code
    If x = "" took: 188.4344 ms
    If x == "" took: 166.4387 ms
    If BitAnd() took: 182.9312 ms
    If (x & y) = "" took: 86.6626 ms
    If (x & y) == "" took: 80.3188 ms
    If Not (x & y) took: 77.9772 ms
  • Code Kata - Happy Numbers

    • Lambdax
    • 6. Februar 2022 um 11:04

    Könnte hinhauen

    Spoiler anzeigen
    Code
    For $i = 1 To 100
        If _IsHappyNumber($i) Then ConsoleWrite($i & " -> 1" & @CRLF)
    Next
    
    Func _IsHappyNumber($nNum)
        ; do until result is 1 or result is repeated
        Do
            Assign($nNum, True, 1)
            $nNum = __NumArrayQ2(StringSplit(String($nNum), '', 1))
        Until $nNum == 1 Or Eval($nNum)
    
        If $nNum == 1 Then Return True
        Return False
    EndFunc
    
    Func __NumArrayQ2(Const $arNums)
        Local $nResult = 0
        For $i = 1 To $arNums[0]
            $nResult += Int($arNums[$i]) ^ 2
        Next
        Return $nResult
    EndFunc
    Alles anzeigen
  • Windows 10 - muss man nicht verstehen

    • Lambdax
    • 1. Februar 2022 um 23:19

    Prüfe mal den Virtual Store

    Windows Virtual Store Location - Networking HowTos
    Since Windows Vista was released, Windows has had a security feature called the Virtual Store. Some legacy applications will try and read/write configuration…
    www.networkinghowtos.com

    Ich hatte mal ein problem damit. Eine software brauchte erhöhte rechte, konnte aber aus gründen die ich nicht kenne, nicht an den pfad schreiben an den es sollte, und hat es also dorthin abgelegt. Eine andere software brauchte die dateien aber. Hat ne weile gedauert bis ich rausfand wo die dateien hin waren. Ich hab sie dann einfach vom virtual store gelöscht und damit war das problem erledigt.

  • Funktion Assign

    • Lambdax
    • 1. Februar 2022 um 22:05

    Oke ich hab was interessantes herausgefunden. Ich hab die neue dictobj method in die UDF eingebaut und mich dann doch gewundert warum die UDF plötzlich viel langsamer war als zuvor. Erst dachte ich an ein problem mit der integration aber dem war nicht der fall.

    Ich hatte so eine idee, deshalb hab ich deinen test von oben erneuert und die zu schreibenden daten vergrößert. Dabei ist mir aufgefallen das das dictobj viel schneller bei kleinen daten ist aber langsamer bei großen.

    Hier wird jetzt ein datenset von 1 MB erstellt und in das obj als auch in die globalen gegeben. Und die anzahl an durchläufen sind verringert, der RAM soll ja nicht volllaufen.

    Code
    Global Const $N = 1000
    
    Global $iT, $iDuration, $iDurationOffset, $iTmp
    
    Local $sData = ''
    For $i = 1 To 1048576
        $sData &= '1'
    Next
    
    
    $iT = TimerInit()
    For $i = 1 To $N
    Next
    $iDurationOffset = TimerDiff($iT)
    
    $iT = TimerInit()
    For $i = 1 To $N
        Assign("Var " & $i, $sData)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Assign", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    Global $oDic = ObjCreate("Scripting.Dictionary")
    For $i = 1 To $N
        $oDic("Var " & $i) = $sData
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Dictionary Add", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    For $i = 1 To $N
        _storageS_Overwrite(123, "Var " & $i, $sData)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n\n", "_storageS_Overwrite", ($iDuration - $iDurationOffset) / $N))
    
    
    
    $iT = TimerInit()
    For $i = 1 To $N
        $iTmp = Eval("Var " & $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Eval", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    For $i = 1 To $N
        $iTmp = $oDic("Var " & $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Dictionary Get", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    For $i = 1 To $N
        $iTmp = _storageS_Read(123, "Var " & $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n\n", "_storageS_Read", ($iDuration - $iDurationOffset) / $N))
    
    
    
    Func _storageS_Overwrite($ElementGroup, $Element0, $Element1)
        Local $sVarName = "__storageS_" & $ElementGroup & $Element0
    
        ; we wont declare vars if $Element1 is False because _storageS_Read() always returns False and @error 1 on undeclared vars
        If $Element1 == False And Not IsDeclared($sVarName) Then Return 1
        If Not IsDeclared($sVarName) Then __storageS_AddGroupVar($ElementGroup, $Element0)
    
        Return Assign($sVarName, $Element1, 2)
    EndFunc   ;==>_storageS_Overwrite
    
    Func _storageS_Append($ElementGroup, $Element0, $Element1)
        Local $sVarName = "__storageS_" & $ElementGroup & $Element0
    
        If Not IsDeclared($sVarName) Then Return _storageS_Overwrite($ElementGroup, $Element0, $Element1)
    
        Return Assign($sVarName, Eval($sVarName) & $Element1, 2)
    EndFunc   ;==>_storageS_Append
    
    Func _storageS_Read($ElementGroup, $Element0)
        Local $sVarName = "__storageS_" & $ElementGroup & $Element0
    
        If Not IsDeclared($sVarName) Then Return SetError(1, 0, False)
        Return Eval($sVarName)
    EndFunc   ;==>_storageS_Read
    
    Func __storageS_AddGroupVar($ElementGroup, $Element0)
        If $ElementGroup = "StorageS" Then Return
    
        Local $arGroupVars = _storageS_Read("StorageS", $ElementGroup)
        If Not IsArray($arGroupVars) Then
            Local $arGroupVars[0]
        EndIf
    
        Local $nArSize = UBound($arGroupVars)
    
        ReDim $arGroupVars[$nArSize + 1]
        $arGroupVars[$nArSize] = $Element0
        _storageS_Overwrite("StorageS", $ElementGroup, $arGroupVars)
    EndFunc   ;==>__storageS_AddGroupVar
    
    Func _storageS_TidyGroupVars($ElementGroup)
        Local $arGroupVars = _storageS_Read("StorageS", $ElementGroup)
        If Not IsArray($arGroupVars) Then Return
    
        For $i = 0 To UBound($arGroupVars) - 1
            _storageS_Overwrite($ElementGroup, $arGroupVars[$i], Null)
        Next
    
        _storageS_Overwrite("StorageS", $ElementGroup, Null)
    EndFunc   ;==>_storageS_TidyGroupVars
    
    Func _storageS_DisplayGroupVars($ElementGroup)
        Local $arGroupVars = _storageS_Read("StorageS", $ElementGroup)
        If Not IsArray($arGroupVars) Then Return
    
        Local $nArSize = UBound($arGroupVars)
        Local $arGroupVars2D[$nArSize][3]
        Local $vData
    
        For $i = 0 To $nArSize - 1
            $arGroupVars2D[$i][0] = "__storageS_" & $ElementGroup & $arGroupVars[$i]
    
            $vData = _storageS_Read($ElementGroup, $arGroupVars[$i])
            $arGroupVars2D[$i][1] = VarGetType($vData)
            $arGroupVars2D[$i][2] = $vData
        Next
    
        Return $arGroupVars2D
    EndFunc   ;==>_storageS_DisplayGroupVars
    Alles anzeigen
    Code
                  Assign: 0.00147 ms
          Dictionary Add: 2.90448 ms
     _storageS_Overwrite: 0.15680 ms
    
                    Eval: 0.00113 ms
          Dictionary Get: 1.91853 ms
          _storageS_Read: 0.00772 ms
  • Funktion Assign

    • Lambdax
    • 1. Februar 2022 um 19:13

    Massiv klingt fast untertrieben, das ist ein unterschied wie tag und nacht :huh: . Ich hab zum testen jetzt mal eine kombination aus Assign/Eval und dem DictObj in _storageS gebaut.

    Code
    Global Const $N = 1e4
    
    Global $iT, $iDuration, $iDurationOffset, $iTmp
    
    $iT = TimerInit()
    For $i = 1 To $N
    Next
    $iDurationOffset = TimerDiff($iT)
    
    $iT = TimerInit()
    For $i = 1 To $N
        Assign("Var " & $i, $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Assign", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    Global $oDic = ObjCreate("Scripting.Dictionary")
    For $i = 1 To $N
        $oDic("Var " & $i) = $i
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Dictionary Add", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    _storageS_CreateGroup(123)
    For $i = 1 To $N
        _storageS_Overwrite(123, "Var " & $i, $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n\n", "_storageS_Overwrite", ($iDuration - $iDurationOffset) / $N))
    
    
    
    $iT = TimerInit()
    For $i = 1 To $N
        $iTmp = Eval("Var " & $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Eval", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    For $i = 1 To $N
        $iTmp = $oDic("Var " & $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Dictionary Get", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    For $i = 1 To $N
        $iTmp = _storageS_Read(123, "Var " & $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n\n", "_storageS_Read", ($iDuration - $iDurationOffset) / $N))
    
    
    Func _storageS_CreateGroup($ElementGroup)
        Local $oElementGroup = ObjCreate("Scripting.Dictionary")
        Assign($ElementGroup, $oElementGroup, 2)
    EndFunc
    
    Func _storageS_Overwrite($ElementGroup, $Element0, $Element1)
        Local $oElementGroup = Eval($ElementGroup)
        $oElementGroup($Element0) = $Element1
    EndFunc
    
    Func _storageS_Read($ElementGroup, $Element0)
        Local $oElementGroup = Eval($ElementGroup)
        Return $oElementGroup($Element0)
    EndFunc
    Alles anzeigen
    Code
                  Assign: 0.00204 ms
          Dictionary Add: 0.00396 ms
     _storageS_Overwrite: 0.00734 ms
    
                    Eval: 0.00111 ms
          Dictionary Get: 0.00290 ms
          _storageS_Read: 0.00646 ms

    Und das es möglich ist das Dict auch zu löschen ist ebenfalls ein massiver vorteil gegenüber den Globalen Variablen


    EDIT

    Und jetzt nochmal das ganze, aber ohne Assign und Eval

    Code
    Global $__storageS_oDictionaries = ObjCreate("Scripting.Dictionary")
    Global Const $N = 1e4
    
    Global $iT, $iDuration, $iDurationOffset, $iTmp
    
    $iT = TimerInit()
    For $i = 1 To $N
    Next
    $iDurationOffset = TimerDiff($iT)
    
    $iT = TimerInit()
    For $i = 1 To $N
        Assign("Var " & $i, $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Assign", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    Global $oDic = ObjCreate("Scripting.Dictionary")
    For $i = 1 To $N
        $oDic("Var " & $i) = $i
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Dictionary Add", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    _storageS_CreateGroup(123)
    For $i = 1 To $N
        _storageS_Overwrite(123, "Var " & $i, $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n\n", "_storageS_Overwrite", ($iDuration - $iDurationOffset) / $N))
    
    
    
    $iT = TimerInit()
    For $i = 1 To $N
        $iTmp = Eval("Var " & $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Eval", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    For $i = 1 To $N
        $iTmp = $oDic("Var " & $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n", "Dictionary Get", ($iDuration - $iDurationOffset) / $N))
    
    $iT = TimerInit()
    For $i = 1 To $N
        $iTmp = _storageS_Read(123, "Var " & $i)
    Next
    $iDuration = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s: %7.5f ms\n\n", "_storageS_Read", ($iDuration - $iDurationOffset) / $N))
    
    
    
    Func _storageS_CreateGroup($ElementGroup)
        Local $oElementGroup = ObjCreate("Scripting.Dictionary")
        $__storageS_oDictionaries($ElementGroup) = $oElementGroup
    EndFunc
    
    Func _storageS_Overwrite($ElementGroup, $Element0, $Element1)
        Local $oElementGroup = $__storageS_oDictionaries($ElementGroup)
        $oElementGroup($Element0) = $Element1
    EndFunc
    
    Func _storageS_Read($ElementGroup, $Element0)
        Local $oElementGroup = $__storageS_oDictionaries($ElementGroup)
        Return $oElementGroup($Element0)
    EndFunc
    
    Func _storageS_TidyGroupVars($ElementGroup)
        Local $oElementGroup = $__storageS_oDictionaries($ElementGroup)
    
        For $i In $oElementGroup
            $oElementGroup.Remove($i)
        Next
    
        $__storageS_oDictionaries.Remove($ElementGroup)
    EndFunc
    
    Func _storageS_DisplayGroupVars($ElementGroup)
        Local $oElementGroup = $__storageS_oDictionaries($ElementGroup)
    
        Local $arGroupVars2D[$oElementGroup.Count][3]
        For $i In $oElementGroup
            $arGroupVars2D[$i][0] = $i
            $arGroupVars2D[$i][1] = VarGetType($oElementGroup($i))
            $arGroupVars2D[$i][2] = $oElementGroup($i)
        Next
    
        Return $arGroupVars2D
    EndFunc
    Alles anzeigen

    Von der Geschwindigkeit her änderte sich nichts, aber es funktioniert jetzt gänzlich ohne Assign/Eval

  • Funktion Assign

    • Lambdax
    • 1. Februar 2022 um 17:21
    Zitat von AspirinJunkie

    Über diese kannst du jedoch nicht iterieren. Sprich: Du weißt im Grunde nie genau, welche Variablen nun tatsächlich alle definiert sind.
    Das führt sicher irgendwann dazu, dass diese im Speicher verbleiben auch wenn sie nicht mehr gebraucht werden oder mal von einer anderen Funktion überschrieben werden die zufällig den selben Variablennamen verwendet usw.

    Doch ich kann itterieren, ich weiß genau wo und wann welcher Socket welche variablen trägt und in welch einem Zustand diese sich befinden. Und zufällig wird der gleiche variablen name auch nicht verwendet, deshalb nicht weil die socket nummer teil der variable ist und diese nicht zur gleichen zeit zweimal existiert.

    Ich zeige dir mal wie ich das mache

    C
    #NoTrayIcon
    #include <Array.au3>
    
    ; ein fake socket
    Local $hFakeSocket = 123
    
    
    ; jetzt setzen wir irgendwelche beliebigen variablen
    _storageS_Overwrite($hFakeSocket, '_netcode_TestString', 'Ein String')
    _storageS_Overwrite($hFakeSocket, '_netcode_TestInt', Int(Random(0, 99, 1)))
    _storageS_Overwrite($hFakeSocket, '_netcode_TestPtr', Ptr(0))
    _storageS_Overwrite($hFakeSocket, '_netcode_TestBool', True)
    Local $arTestArray[2][2] = [[1,1],[2,2]]
    _storageS_Overwrite($hFakeSocket, '_netcode_TestArray', $arTestArray)
    
    
    ; was sind unsere variablen
    Local $arAlleVariablenDesFakeSockets = _storageS_DisplayGroupVars($hFakeSocket)
    
    ; anzeigen
    _ArrayDisplay($arAlleVariablenDesFakeSockets, "Das sind die variablen des Fake sockets")
    
    
    ; zum test aufrufen
    ConsoleWrite("Test String = " & @TAB & _storageS_Read($hFakeSocket, '_netcode_TestString') & @CRLF)
    ConsoleWrite("Test Int = " & @TAB & _storageS_Read($hFakeSocket, '_netcode_TestInt') & @CRLF)
    ConsoleWrite("Test Ptr = " & @TAB & _storageS_Read($hFakeSocket, '_netcode_TestPtr') & @CRLF)
    ConsoleWrite("Test Bool = " & @TAB & _storageS_Read($hFakeSocket, '_netcode_TestBool') & @CRLF)
    $arTestArray = _storageS_Read($hFakeSocket, '_netcode_TestArray')
    ConsoleWrite("Test Array[0][0] = " & @TAB & $arTestArray[0][0] & @CRLF)
    
    
    ; jetzt löschen wir die variablen
    _storageS_TidyGroupVars($hFakeSocket)
    
    ; sind sie jetzt wirklich gelöscht?
    ; nö, mir ist kein weg bekannt globale variablen zu löschen, aber mann kann sie mit Null überschreiben
    
    ; zum test nochmal aufrufen
    ConsoleWrite(@CRLF)
    ConsoleWrite("VarGetType String = " & @TAB & VarGetType(_storageS_Read($hFakeSocket, '_netcode_TestString')) & @CRLF)
    ConsoleWrite("VarGetType Int = " & @TAB & VarGetType(_storageS_Read($hFakeSocket, '_netcode_TestInt')) & @CRLF)
    ConsoleWrite("VarGetType Ptr = " & @TAB & VarGetType(_storageS_Read($hFakeSocket, '_netcode_TestPtr')) & @CRLF)
    ConsoleWrite("VarGetType Bool = " & @TAB & VarGetType(_storageS_Read($hFakeSocket, '_netcode_TestBool')) & @CRLF)
    ConsoleWrite("VarGetType Array = " & @TAB & VarGetType(_storageS_Read($hFakeSocket, '_netcode_TestArray')) & @CRLF)
    
    
    
    
    Func _storageS_Overwrite($ElementGroup, $Element0, $Element1)
        Local $sVarName = "__storageS_" & $ElementGroup & $Element0
    
        ; we wont declare vars if $Element1 is False because _storageS_Read() always returns False and @error 1 on undeclared vars
        If $Element1 == False And Not IsDeclared($sVarName) Then Return 1
        If Not IsDeclared($sVarName) Then __storageS_AddGroupVar($ElementGroup, $Element0)
    
        Return Assign($sVarName, $Element1, 2)
    EndFunc   ;==>_storageS_Overwrite
    
    Func _storageS_Append($ElementGroup, $Element0, $Element1)
        Local $sVarName = "__storageS_" & $ElementGroup & $Element0
    
        If Not IsDeclared($sVarName) Then Return _storageS_Overwrite($ElementGroup, $Element0, $Element1)
    
        Return Assign($sVarName, Eval($sVarName) & $Element1, 2)
    EndFunc   ;==>_storageS_Append
    
    Func _storageS_Read($ElementGroup, $Element0)
        Local $sVarName = "__storageS_" & $ElementGroup & $Element0
    
        If Not IsDeclared($sVarName) Then Return SetError(1, 0, False)
        Return Eval($sVarName)
    EndFunc   ;==>_storageS_Read
    
    Func __storageS_AddGroupVar($ElementGroup, $Element0)
        If $ElementGroup = "StorageS" Then Return
    
        Local $arGroupVars = _storageS_Read("StorageS", $ElementGroup)
        If Not IsArray($arGroupVars) Then
            Local $arGroupVars[0]
        EndIf
    
        Local $nArSize = UBound($arGroupVars)
    
        ReDim $arGroupVars[$nArSize + 1]
        $arGroupVars[$nArSize] = $Element0
        _storageS_Overwrite("StorageS", $ElementGroup, $arGroupVars)
    EndFunc   ;==>__storageS_AddGroupVar
    
    Func _storageS_TidyGroupVars($ElementGroup)
        Local $arGroupVars = _storageS_Read("StorageS", $ElementGroup)
        If Not IsArray($arGroupVars) Then Return
    
        For $i = 0 To UBound($arGroupVars) - 1
            _storageS_Overwrite($ElementGroup, $arGroupVars[$i], Null)
        Next
    
        _storageS_Overwrite("StorageS", $ElementGroup, Null)
    EndFunc   ;==>_storageS_TidyGroupVars
    
    Func _storageS_DisplayGroupVars($ElementGroup)
        Local $arGroupVars = _storageS_Read("StorageS", $ElementGroup)
        If Not IsArray($arGroupVars) Then Return
    
        Local $nArSize = UBound($arGroupVars)
        Local $arGroupVars2D[$nArSize][3]
        Local $vData
    
        For $i = 0 To $nArSize - 1
            $arGroupVars2D[$i][0] = "__storageS_" & $ElementGroup & $arGroupVars[$i]
    
            $vData = _storageS_Read($ElementGroup, $arGroupVars[$i])
            $arGroupVars2D[$i][1] = VarGetType($vData)
            $arGroupVars2D[$i][2] = $vData
        Next
    
        Return $arGroupVars2D
    EndFunc   ;==>_storageS_DisplayGroupVars
    Alles anzeigen

    Wenn du dir die funktionen angesehen hast, wirst du bemerkt haben das jede neu erstellte variable gespeichert wird und das diese mit einem funktionsaufruf einfach mit Null überschrieben werden können. Und es ist auch möglich sich die variablen jederzeit anzusehen.

    Man könnte jetzt noch weitergehen und eine erstellung von variablen sogar verneinen wenn nicht vorher die gruppe schon erstellt wurde. Würde man dann, sobald der socket entfernt wird, auch die gruppe entfernen, dadurch also verhindern dass weitere variablen (versehentlich) erstellt oder neu beschrieben werden, dann wäre man auch geschützter gegen memory leaks.

    Ich habe zig tests gemacht mit Assign und Eval, man muss eben sorgfältig mit ihnen umgehen, aber im gegenzug bekommt man dafür sehr kurze schreib und zugriffszeiten.

  • Funktion Assign

    • Lambdax
    • 1. Februar 2022 um 06:14

    Das es sich um einen Pointer handelt finde ich gut, ich habe mich schon gefragt wie ich die UDF wohl umbasteln müsste wenn immer das ganze objekt mit gegeben werden muss. Ähnlich tue ich das in der UDF, nur das dort der Socket der Pointer ist. Ich werde ausführlich testen müssen ob sich aus entweder dem dictobj oder den assosiativen arrays tatsächlich ein performance gewinn ergibt. Denn wenn ja dann lohnt sie die nutzung bestimmt.

  • Funktion Assign

    • Lambdax
    • 1. Februar 2022 um 05:38
    Zitat von AspirinJunkie

    Ja: Assoziative Arrays wie das Scripting.Dictionary-Objekt oder der Datentyp Maps in den AutoIt-Betas.

    Das werde ich mir mal genauer ansehen, danke schön für den tipp ^^

  • Funktion Assign

    • Lambdax
    • 31. Januar 2022 um 22:39

    Auf Assign und Eval basiert meine gesamte _netcode TCP UDF. Da in der UDF jeder socket seine eigenen optionen und daten bekommt und ich zu unerfahren mit objekten bin, fand ich das man mit mit Assign und Eval sehr einfach sehr schnell daten verändern und aufrufen kann und das von überall. Ist wie mit globalen variablen, nur das diese dynamisch sind. Vorsicht ist aber geboten, verändert man sie an der falschen stelle kracht es. Vielleicht gibt es auch bessere und schnelle wege, aber bis ich die gefunden habe mache ich es erstmal so.

  • SelfUpdate - ein Update fuer das eigene Programm

    • Lambdax
    • 31. Januar 2022 um 00:22

    Hier mal der datei austausch ohne eine .bat datei. Alles bleibt im ram und der ständig kreischende AV bleibt ruhig.

    Started die cmd.exe mit einer reihe von befehlen die nacheinander ausgeführt werden.

    >ping localhost -n 2< bedeutet soviel wie das erstmal 127.0.0.1 2 mal gepingt wird. Ist einfach sowas wie Sleep(2000). Die CMD soll halt 2 sekunden warten. Bis dahin ist die Autoit Exe sicherlich bereits aus.

    >del /F "alte.exe"< bedeutet das die alte datei gelöscht wird. /F dabei Force

    >move "update.exe" "alte.exe"< bedeutet das das update and die stelle der alten datei geschoben wird

    >start "" "alte.exe"< bedeutet das die neue datei jetzt ausgeführt wird

    Ginge bestimmt auch noch weiter zu kürzen und es ginge auch der update.exe noch parameter mitzugeben.

    AutoIt
    _UpdateMyself(@ScriptFullPath, "Update.exe")
    
    Func _UpdateMyself($sThatsMyFullPath, $sThatMyUpdateFile)
        ; if we are not compiled then i guess you dont want to update the script
        if Not @Compiled Then Return
    
        Local $sThatsMe = StringTrimLeft($sThatsMyFullPath, StringInStr($sThatsMyFullPath, '\', 0, -1))
        Local $sThatMyPath = StringTrimRight($sThatsMyFullPath, StringLen($sThatsMe))
    
        Run(@ComSpec & ' /C ping localhost -n 2 & del /F "' & $sThatsMe & '" & move "' & $sThatMyUpdateFile & '" "' & $sThatsMe & '" & start "" "' & $sThatsMe & '"', $sThatMyPath)
        Exit
    EndFunc
    Alles anzeigen
  • Script zum Hochladen von Dateien auf einen Server

    • Lambdax
    • 30. Januar 2022 um 23:09
    Zitat von SOLVE-SMART

    Hi Lambdax ,

    noch bin ich nicht dazu gekommen mir das Projekt (bzw. die GitHub-Projekte) mal im Detail anzuschauen, doch bisher sieht es sehr interessant und nützlich aus.
    Vielen Dank dafür 👍 . Bei Gelegenheit versuche ich mal paar Tests dazu zu machen.

    Viele Grüße
    Sven

    Alles anzeigen

    Gerne :)

    Frag wen was unklar ist oder nicht funktioniert wie du es dir erhoffst.

  • Script zum Hochladen von Dateien auf einen Server

    • Lambdax
    • 30. Januar 2022 um 00:09

    Ist eigentlich nur ein beispiel script für eine UDF an der ich arbeite, aber vielleicht braucht mal jemand sowas.

    Das script is simpel gehalten. Datei übertragungen gehen nur einseitig. Von einem oder mehreren clienten zu einem server.

    Mit dem clienten kann man auswählen ob man eine einzelne datei hochladen möchte oder einen ganzen ordner und seine sämtlichen inhalte.

    Im server kann man einstellen ob die dateien verschlüsselt übertragen werden sollen, ob bereits bestehende datein überschrieben werden können, wieviele clienten gleichzeitig etwas hochladen dürfen und ein zwei sachen mehr.

    Das script an sich ist hier verfügbar

    _netcode_Core-UDF/examples/extended examples/Transfer Files/netcode managemode at main · OfficialLambdax/_netcode_Core-UDF
    a extended Event based TCP/TLS/IPv4/IPv6 UDF for Autoit3 - _netcode_Core-UDF/examples/extended examples/Transfer Files/netcode managemode at main ·…
    github.com

    man benötigt auch die _netcode_Core.au3 UDF von hier

    GitHub - OfficialLambdax/_netcode_Core-UDF: a extended Event based TCP/TLS/IPv4/IPv6 UDF for Autoit3
    a extended Event based TCP/TLS/IPv4/IPv6 UDF for Autoit3 - GitHub - OfficialLambdax/_netcode_Core-UDF: a extended Event based TCP/TLS/IPv4/IPv6 UDF for Autoit3
    github.com

    Sollte sich das script nicht ausführen lassen dann wahrscheinlich weil die pfade zur _netcode_Core.au3 UDF in den #includes falsch sind.

    Ansonsten nutzt der server eine preshared rsa handshake method, wo der client den öffentlichen schlüssel des servers bereits kennen muss um mit ihm einen sitzungsschlüssel auszumachen.

    In dem beispiel ordner ist auch ein script namens "#set preshared rsa keys.au3" welches ein schlüssel paar generiert und in die server.au3 und client.au3 schreibt.

    Mir fällt gerade auf das der Autor der _RecursiveFileListToArray() funktion teil dieses forums ist Oscar

    Die funktion wird nämlich von dem clienten benutzt.

    Edit: Läuft mit Autoit Stable und Beta und sowohl mit 32- als auch mit 64 Bit. Beta und 64 Bit am schnellsten.

    40 - 60 MB/s zwischen typischen end nutzer computern sollten drinnen sein, sofern die leitung es zulässt.

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™