While Schleifen Problem

12/28/2010 03:08 freehuntx#1
Hi Com.,

ich habe einen Fritzbox ip changer geschrieben.

Alles klappt wunderbar, nur macht mir die while schleife zu schaffen.

Hier mein Script.

Code:
#include <INet.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
HotKeySet("{NUMPAD1}", "_change")
Global $AutoChange = false


#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Fr!tzBox Ip Changer by FreehuntX", 360, 154, 294, 253)
$Group1 = GUICtrlCreateGroup("Simple Changer", 8, 0, 153, 57)
$Button1 = GUICtrlCreateButton("Change", 16, 24, 75, 25)
$Label1 = GUICtrlCreateLabel("or    Num1", 96, 32, 53, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label2 = GUICtrlCreateLabel("Current IP:", 8, 72, 54, 17)
$Label3 = GUICtrlCreateLabel("Please Wait", 64, 72, 101, 17)
$Group2 = GUICtrlCreateGroup("Status", 8, 96, 153, 49)
$Label4 = GUICtrlCreateLabel("Nothing...", 32, 120, 50, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("Time Changer", 168, 0, 185, 145)
$Input1 = GUICtrlCreateInput("1800", 224, 22, 113, 21)
$Label5 = GUICtrlCreateLabel("Delay:", 176, 24, 34, 17)
$Button2 = GUICtrlCreateButton("Start", 176, 56, 75, 25)
$Button3 = GUICtrlCreateButton("Stop", 264, 56, 75, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup("Status", 176, 88, 169, 49)
$Label6 = GUICtrlCreateLabel("Nothing...", 200, 112, 50, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUICtrlSetState($Button3, $GUI_DISABLE)
GUICtrlSetdata($Label3,_GetIp())




While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
			
		Case $Button1
			_change()
			
		Case $button2
			_AutoON()
			
		Case $Button3
			_AutoOFF()

	EndSwitch
WEnd



Func _change()
GUICtrlSetState($Button1, $GUI_DISABLE)
GUICtrlSetdata($Label4,"Changing...")
TrayTip("Fritz!Box","Die Internetverbindung wird jetzt getrennt ...", 8)
RunWait(@ComSpec & " /c " & 'type data.box | "' & @ScriptDir & '\nc.exe" -w 1 fritz.box 49000 >nul', "", @SW_HIDE)
TrayTip("Fritz!Box","Die Internetverbindung wurde getrennt und kann jetzt wiederhergestellt werden!", 8)
Sleep(3000)
GUICtrlSetdata($Label3,_GetIp())
GUICtrlSetdata($Label4,"Changed!")
GUICtrlSetState($Button1, $GUI_Enable)
sleep(3000)
GUICtrlSetdata($Label4,"Nothing...")
EndFunc

Func _AutoON()
GUICtrlSetState($Button2, $GUI_DISABLE)
GUICtrlSetState($Button3, $GUI_Enable)
$AutoChange = true
while $AutoChange = true
Sleep(GUICtrlRead($Input1)*1000)
GUICtrlSetdata($Label6,"Changing...")
GUICtrlSetState($Button1, $GUI_Disable)
TrayTip("Fritz!Box","Die Internetverbindung wird jetzt getrennt ...", 8)
RunWait(@ComSpec & " /c " & 'type data.box | "' & @ScriptDir & '\nc.exe" -w 1 fritz.box 49000 >nul', "", @SW_HIDE)
TrayTip("Fritz!Box","Die Internetverbindung wurde getrennt und kann jetzt wiederhergestellt werden!", 8)
Sleep(3000)
GUICtrlSetdata($Label3,_GetIp())
GUICtrlSetdata($Label6,"Changed!")
GUICtrlSetState($Button1, $GUI_Enable)
sleep(3000)
GUICtrlSetdata($Label6,"Nothing...")
If $AutoChange = false Then ExitLoop
wend
EndFunc

Func _AutoOFF()
GUICtrlSetState($Button2, $GUI_Enable)
GUICtrlSetState($Button3, $GUI_DISABLE)
$AutoChange = false
	
EndFunc
Ich komme einfach nicht weiter.

Ich möchte lediglich dass der Stop button, während der schleife verwenbar ist, um die schleife zu beenden.

hoffe ihr könnt mir geschickte ideen geben.
12/28/2010 11:08 KDeluxe#2
Ich hab das ganze mal überschaubar geändert. Die TrayTips habe ich mit den
Sleeps entfernt, da die 6 Sekunden beim drücken auf den Stop Button nerven
könnten. Falls du sie wieder rein nehmen willst würde ich dir Timer empfehlen.

PHP Code:
#include <INet.au3>
#include <GUIConstantsEx.au3>

#Region ### START Koda GUI section ### Form=
GUICreate("FR!TZBox IP Changer by FreehuntX"360155)
GUICtrlCreateGroup("Simple Changer"8015357)
$B_Change GUICtrlCreateButton("Change"16247525)
GUICtrlCreateLabel("or    Num1"96325317)
GUICtrlCreateGroup("", -99, -9911)
GUICtrlCreateLabel("Current IP:"8725417)
$L_IP GUICtrlCreateLabel("Please Wait"647210117)
GUICtrlCreateGroup("Status"89615349)
$L_Status GUICtrlCreateLabel("Nothing..."2012014017)
GUICtrlCreateGroup("", -99, -9911)
GUICtrlCreateGroup("Time Changer"1680185145)
$I_Delay GUICtrlCreateInput("1800"2242211321)
GUICtrlCreateLabel("Delay:"176243417)
$B_Start GUICtrlCreateButton("Start"176567525)
$B_Stop GUICtrlCreateButton("Stop"264567525)
GUICtrlCreateGroup("", -99, -9911)
GUICtrlCreateGroup("Status"1768816949)
$L_StatusT GUICtrlCreateLabel("Nothing..."19011214517)
GUICtrlCreateGroup("", -99, -9911)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUICtrlSetState($B_Stop$GUI_DISABLE)
GUICtrlSetdata($L_IP_GetIp())

Global 
$Start$AutoChange False
Global $Timer$Hotkey True
HotKeySet
("{NUMPAD1}""_ChangeH")

While 
Sleep(10)
    
$nMsg GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$B_Change
            _Change
()
        Case 
$B_Start
            GUICtrlSetState
($B_Start$GUI_DISABLE)
            
GUICtrlSetState($B_Stop$GUI_ENABLE)
            
$AutoChange True
            $Start 
True
        
Case $B_Stop
            GUICtrlSetState
($B_Start$GUI_ENABLE)
            
GUICtrlSetState($B_Stop$GUI_DISABLE)
            
$AutoChange False
            $Timer 
0
    
EndSwitch

    If 
$AutoChange Then
        
If $Start Then
            _Change
($L_StatusT)
            
$Timer TimerInit()
            
$Start False
        
EndIf

        If 
TimerDiff($Timer) >= (GUICtrlRead($I_Delay) * 1000Then
            _Change
($L_StatusT)
            
$Timer TimerInit()
        EndIf
    EndIf
WEnd

Func _ChangeH
()
    If 
$Hotkey Then
        $Hotkey 
False
        _Change
()
    EndIf
EndFunc

Func _Change
($Label $L_Status)
    If 
$Label == $L_Status Then GUICtrlSetState($B_Change$GUI_DISABLE)

    
GUICtrlSetdata($Label,"Changing...")
    
RunWait(@ComSpec " /c " 'type data.box | "' & @ScriptDir '\nc.exe" -w 1 fritz.box 49000 >nul'"", @SW_HIDE)
    
GUICtrlSetdata($L_IP_GetIp())
    
GUICtrlSetdata($Label"Last Change: " & @HOUR ":" & @MIN ":" & @SEC)

    If 
$Label == $L_Status Then GUICtrlSetState($B_Change$GUI_ENABLE)
    If 
$Hotkey == False Then $Hotkey True
EndFunc 
12/28/2010 16:32 freehuntx#3
danke, aber das problem ist damit leider nicht gelöst.
12/28/2010 18:13 KDeluxe#4
Eigentlich sollte sich deine Frage von selbst beantworten, wechselst du von
einer Schleife in die andere wird die vorherige nicht mehr beachtet. Ist die
Bedingung für deine 2. Schleife erst einmal erfüllt bleibt sie das bei deinem
Script für immer. Ein einfaches
PHP Code:
If GUIGetMsg() == $button2 Then $AutoChange False 
in deiner 2. Schleife würde das Problem lösen.


Nächstes Problem:
PHP Code:
Sleep(GUICtrlRead($Input1)*1000
Du pausierst das gesamte Script für die eingetragene Zeit, in der Zeit kannst
du mit einem Script generell wenig Anfang. Die Benutzung eines Timers wäre
hier angebracht. Die Funktionen "_Change" und "_AutoON" sind fast identisch.
Alles in eine Schleife zu packen, wie ich es gemacht habe, ist meiner Meinung
nach praktischer. Den Zusatz "by FreehuntX" beim Titel finde ich außerdem
etwas dreist, da du eigentlich nur die GUI gemacht hast und den Rest vom
"FR!TZBox Reconnecter" kopiert hast und das ohne einen Vermerk.
12/28/2010 22:41 freehuntx#5
1. Enthält dieser Reconnector 3 zeilen.
2. Wird es sowieso nicht releaset, es dient lediglich zu privaten zwecken.
3. Würdest du Credits angeben wenn du dir ein Program für eigene zwecke schreibst? Denke ich nicht.

Ich wusste ja dass das Sleep die Probleme verursacht...
Gibt es vielleicht eine andere funktion, ähnlich wie sleep, welche sinnvoller ist?
12/28/2010 22:44 PenGuin :O#6
Quote:
Originally Posted by KillerDeluxe View Post
Den Zusatz "by FreehuntX" beim Titel finde ich außerdem
etwas dreist, da du eigentlich nur die GUI gemacht hast und den Rest vom
"FR!TZBox Reconnecter" kopiert hast und das ohne einen Vermerk.
So gesehen, müsstest du bei jeder GUI, die du entwirfst, die Credits von dem angeben, ders zuerst gemacht hat :P
Oder beim Injecten per WirteProcessMemory, z.B.
12/29/2010 00:38 KDeluxe#7
Ob ich etwas ähnliches mache, oder ob ich das "Herzstück" 1 zu 1 kopiere ist etwas
anderes. Bei einem Injector kopiert man auch nicht explizit etwas (im "Normalfall").

Naja, die Lösung ist ein Timer, dafür solltest du dir TimerInit() und TimerDiff() anschauen.
12/29/2010 03:42 freehuntx#8
Damit kann ich ja nur die zeit zwischen einem sleep auslesen.

naja ich werde es dann wohl ohne stop machen müssen
12/29/2010 03:47 KDeluxe#9
Was hindert dich daran, dass von mir gepostete Script zu benutzen? Ist es erst einmal
eine .exe merkst du nur, dass die TrayTips fehlen, die 2 Zeilen kannst du aber auch wieder
mit rein nehmen, dann hast du eigentlich keinen Unterschied.
12/29/2010 18:09 freehuntx#10
1. Lässt sich während des Sleeps nicht Stoppen.
2. Verstehe ich das Script nicht, und dann bringt es mir wenig.
12/29/2010 18:31 PenGuin :O#11
Ja, deshalb ja die Timer Funktionen...
12/29/2010 19:20 KDeluxe#12
Quote:
Originally Posted by KillerDeluxe View Post
Ich hab das ganze mal überschaubar geändert. Die TrayTips habe ich mit den
Sleeps entfernt, da die 6 Sekunden beim drücken auf den Stop Button nerven
könnten. Falls du sie wieder rein nehmen willst würde ich dir Timer empfehlen.

PHP Code:
#include <INet.au3>
#include <GUIConstantsEx.au3>

#Region ### START Koda GUI section ### Form=
GUICreate("FR!TZBox IP Changer by FreehuntX"360155)
GUICtrlCreateGroup("Simple Changer"8015357)
$B_Change GUICtrlCreateButton("Change"16247525)
GUICtrlCreateLabel("or    Num1"96325317)
GUICtrlCreateGroup("", -99, -9911)
GUICtrlCreateLabel("Current IP:"8725417)
$L_IP GUICtrlCreateLabel("Please Wait"647210117)
GUICtrlCreateGroup("Status"89615349)
$L_Status GUICtrlCreateLabel("Nothing..."2012014017)
GUICtrlCreateGroup("", -99, -9911)
GUICtrlCreateGroup("Time Changer"1680185145)
$I_Delay GUICtrlCreateInput("1800"2242211321)
GUICtrlCreateLabel("Delay:"176243417)
$B_Start GUICtrlCreateButton("Start"176567525)
$B_Stop GUICtrlCreateButton("Stop"264567525)
GUICtrlCreateGroup("", -99, -9911)
GUICtrlCreateGroup("Status"1768816949)
$L_StatusT GUICtrlCreateLabel("Nothing..."19011214517)
GUICtrlCreateGroup("", -99, -9911)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUICtrlSetState($B_Stop$GUI_DISABLE)
GUICtrlSetdata($L_IP_GetIp())

Global 
$Start$AutoChange False
Global $Timer$Hotkey True
HotKeySet
("{NUMPAD1}""_ChangeH")

While 
Sleep(10)
    
$nMsg GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$B_Change
            _Change
()
        Case 
$B_Start
            GUICtrlSetState
($B_Start$GUI_DISABLE)
            
GUICtrlSetState($B_Stop$GUI_ENABLE)
            
$AutoChange True
            $Start 
True
        
Case $B_Stop
            GUICtrlSetState
($B_Start$GUI_ENABLE)
            
GUICtrlSetState($B_Stop$GUI_DISABLE)
            
$AutoChange False
            $Timer 
0
    
EndSwitch

    If 
$AutoChange Then
        
If $Start Then
            _Change
($L_StatusT)
            
$Timer TimerInit()
            
$Start False
        
EndIf

        If 
TimerDiff($Timer) >= (GUICtrlRead($I_Delay) * 1000Then
            _Change
($L_StatusT)
            
$Timer TimerInit()
        EndIf
    EndIf
WEnd

Func _ChangeH
()
    If 
$Hotkey Then
        $Hotkey 
False
        _Change
()
    EndIf
EndFunc

Func _Change
($Label $L_Status)
    If 
$Label == $L_Status Then GUICtrlSetState($B_Change$GUI_DISABLE)

    
GUICtrlSetdata($Label,"Changing...")
    
RunWait(@ComSpec " /c " 'type data.box | "' & @ScriptDir '\nc.exe" -w 1 fritz.box 49000 >nul'"", @SW_HIDE)
    
GUICtrlSetdata($L_IP_GetIp())
    
GUICtrlSetdata($Label"Last Change: " & @HOUR ":" & @MIN ":" & @SEC)

    If 
$Label == $L_Status Then GUICtrlSetState($B_Change$GUI_ENABLE)
    If 
$Hotkey == False Then $Hotkey True
EndFunc 
Ich benutze kein Sleep um etwas über längere Zeit zu benutzen, nur
PHP Code:
While Sleep(10
um die CPU Auslastung etwas zu vermindern. Diese 10 Millisekunden stören aber nicht.




Hier kommen ein paar Erklärungen (die am Ende nicht viel bringen?):
12/29/2010 19:38 freehuntx#13
Mal so am Rande.

Dein Script ändert sofort nach drücken des buttons die ip, aber er soll ja immer nach einer bestimmten zeit die ip ändern.
12/29/2010 20:39 PenGuin :O#14
Code:
;PenGuin :O

Global $hGUI, $Start, $Count, $State, $Counter
Global $i = 1

$hGUI = GUICreate("Einfaches Beispiel", 299, 87, 446, 327)
GUISetFont(11, 400, 0, "Arial")
$Start = GUICtrlCreateButton("Start", 24, 48, 113, 25)
$Count = GUICtrlCreateButton("Erhöhen", 160, 48, 113, 25)
$State = GUICtrlCreateLabel("Aus", 66, 16, 47, 21)
$Counter = GUICtrlCreateLabel("1", 205, 16, 47, 21)
GUISetState()

While True
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $Start
			GUICtrlSetstate($Start, 128)
			GUICtrlSetData($State, "Ein")
			AdlibRegister("_MsgBox", 10000)
		Case $Count
			$i += 1
			GUICtrlSetData($Counter, $i)
	EndSwitch
WEnd

Func _MsgBox()
	MsgBox(0, "Zeit", "10 Sekunden vergangen, und du konntest trotzdem noch den anderen Button benutzen!")
	GUICtrlSetData($State, "Aus")
	GUICtrlSetstate($Start, 64)
	AdlibUnRegister("_MsgBox")
EndFunc
Hier mit AdlibRegister.
Der erhöhen Button funktioniert trotzdem noch und nach 10 Sekunden kommt die MsgBox.
12/29/2010 20:55 freehuntx#15
da is doch kein sleep 0.0