Hi Ihr Cracks!
Mithilfe der Vorschläge von Mega und Chrisatack (an dieser Stelle herzlichen Dank) hab ich es nun hingekriegt, mir meinen Trafficmeter so zu bauen, wie ich ihn haben will ...
Das Tool zeigt Up- und Downloadrate an und beendet ein beliebiges Programm, wenn der Uploadwert für eine definierte Zeit unter einem definierten Schwellenwert lag.
Soweit, so gut...
AAAABER:
Ich habe das Tool immer nur mit kurzen Zeiten getestet. Mal nur 10 Sekunden, mal eine Minute.
In der Realität soll aber erst etwas passieren, wenn der Upload eine halbe Stunde lang unter dem Schwellenwert lag.
Nach ca. 20 Minuten (hab ich jetzt nicht genau nachgemessen) bricht das Programm ab mit der Meldung, dass nicht genug freie Ressourcen zu Verfügung stehen.
Daraufhin hab ich mir das Ding mal im Taskmanager angeschaut. Und siehe da: die Auslastung des virtuellen Speichers dieses Tools steigt etwa alle 20 Sekunden um 4kb an.
Das ist natürlich nicht viel, aber ich denke mal, dass es daran liegt, oder?
Ich versteh halt irgendwie nicht, warum die Auslastung permanent ansteigt. Gibt es da bei AutoIT ne Möglichkeit, Speicher wieder freizugeben?
Hier nochmal der Code für Euch...ich hoffe, Ihr kriegt vielleicht was raus...
Spoiler anzeigen
#include <GUIConstants.au3>
#include <Constants.au3>
#include <array.au3>
#include <string.au3>
Opt("GUIOnEventMode", 1)
$begin1 = TimerInit(); Startpunkt Zeitmessung für Netstat
$start = TimerInit() ; Startpunkt Zeitmessung für Tracking
$NetGUI = GUICreate("Tracking Guard v1.0", 294, 100, 197, 120, -1, BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE))
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$Up = GUICtrlCreateLabel("SpeedUp", 8, 50, 100, 20, BitOR($SS_CENTER,$SS_SUNKEN,$WS_GROUP))
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Down = GUICtrlCreateLabel("SpeedDown", 176, 50, 100, 20, BitOR($SS_CENTER,$SS_SUNKEN,$WS_GROUP))
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUICtrlCreateLabel("Upload", 31, 20, 55, 20, $WS_GROUP)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlCreateLabel("Download", 190, 20, 70, 20, $WS_GROUP)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$Progress1 = GUICtrlCreateProgress(8, 80, 100, 9)
$Progress2 = GUICtrlCreateProgress(176, 80, 100, 9)
GUISetState(@SW_SHOW)
GUISetOnEvent(-3, "_exit")
;Initialisieren
$UpStr = 0
$DownStr = 0
$time = 0
$UpStr_alt = 0
$DownStr_alt = 0
_netstat($UpStr, $DownStr); Up,Down das erste mal lesen um Verschiebungspunkte zu suchen
$Xup = $UpStr ;Startpunkt setzen
$Xdown = $DownStr
While 1
Sleep (500)
_netstat($UpStr, $DownStr)
;Differenzen berechnen
$UpStr = $UpStr - $Xup
$DownStr = $DownStr - $Xdown
$Up_speed = $UpStr - $UpStr_alt
$Down_speed = $DownStr - $DownStr_alt
;Zeitliche Differenz berechnen und Zeitmessung Neu starten (Netstat)
$diff = TimerDiff($begin1)
$begin1 = TimerInit()
;Zeitversatz abziehen oder draufrechnen (WICHTIG!)
$Up_speed = $Up_speed/($diff/1000)
$Down_speed = $Down_speed/($diff/1000)
$Up_speed = Round(($Up_speed*8)/1024,2) ; *8 für Byte zu bit /1024 für in kbit
$Down_speed = Round(($Down_speed*8)/1024,2)
$Up_speed_pro = $Up_speed*0.5
$Down_speed_pro = $Down_speed*0.05 ; 0,05 0.00625
GUICtrlSetData ($Progress1,$Up_speed_pro) ;Prozessbalken setzen
GUICtrlSetData ($Progress2,$Down_speed_pro)
GUICtrlSetData ($Up,$Up_speed&' kbit/s') ;Upload Daten setzen
GUICtrlSetData ($Down,$Down_speed&' kbit/s')
;Alte Werte Speichern
$UpStr_alt = $UpStr
$DownStr_alt = $DownStr
;Startpunkt auf 0 setzen, wenn getrackt wird
If $Up_speed > '80' Then
$start = TimerInit()
EndIf
;Zeitliche Differenz berechnen (Tracking)
$ende = TimerDiff($start)
;Tracking beenden, wenn seit >= 30min nicht getrackt wurde
If WinExists("DTrack") And $ende >= '1800000' And $Up_speed < '60' Then
WinActivate("DTrack")
MouseMove(20, 50, 1)
MouseClick("left")
Send("!{F4}")
MsgBox(0, "Tracking beendet", "Es gab seit über 30 Minuten keine Tracking-Aktivität." & @CRLF & "Das Tracking wurde beendet")
Exit
EndIf
WEnd
;netstat -e ausführen und wichtige Werte auslesen
Func _netstat(ByRef $UpStr, ByRef $DownStr)
$NetStat = Run(@ComSpec & " /c netstat -e", @SystemDir, @SW_HIDE, 2)
$LineDos = StdoutRead($NetStat, 400)
If StringInStr($LineDos,'Bytes') = True Then
$Line = _StringBetween ($LineDos,'Bytes','Unicastpakete')
$Line = StringStripWS($Line[0], 7)
$Lines = StringSplit($Line, " ")
$UpStr = $Lines[2]
$DownStr = $Lines[1]
EndIf
EndFunc ;==>_netstat
;Func _Reset(ByRef $TUp, ByRef $TDwn)
; _netstat($UpStr,$DownStr)
; $Tup = $UpStr
; $Tdwn = $DownStr
;EndFunc
Func _exit()
Exit
EndFunc ;==>_exit
ACHTUNG:Ich hab oben bei den #includes die zu ladenden Dateien in runde Klammern gesetzt, weil die Code-Funktion die spitzen Klammern nicht annimmt.
Ich dank Euch.
Viele Grüße,
Trash_Maxx
bernd670: Runde gegen spitze Klammern ausgetauscht!