PAck mal "www." davor
Oh wow, das war jetzt wirklich eine Einfache lösung. Und schon funktioniert wieder jede Webseite. Dankeschön!
PAck mal "www." davor
Oh wow, das war jetzt wirklich eine Einfache lösung. Und schon funktioniert wieder jede Webseite. Dankeschön!
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?
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.
ginge auch. Lief bei mir am schnellsten
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
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
Könnte hinhauen
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
Prüfe mal den Virtual Store
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.
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.
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
Massiv klingt fast untertrieben, das ist ein unterschied wie tag und nacht . Ich hab zum testen jetzt mal eine kombination aus Assign/Eval und dem DictObj in _storageS gebaut.
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
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
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
Ü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
#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.
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.
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
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.
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.
_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
Alles anzeigenHi 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
Gerne
Frag wen was unklar ist oder nicht funktioniert wie du es dir erhoffst.
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
man benötigt auch die _netcode_Core.au3 UDF von hier
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.