|
You last visited: Today at 01:44
Advertisement
While Schleifen Problem
Discussion on While Schleifen Problem within the AutoIt forum part of the Coders Den category.
12/28/2010, 03:08
|
#1
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
[Gelöst]While Schleifen Problem
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
|
#2
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
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", 360, 155)
GUICtrlCreateGroup("Simple Changer", 8, 0, 153, 57)
$B_Change = GUICtrlCreateButton("Change", 16, 24, 75, 25)
GUICtrlCreateLabel("or Num1", 96, 32, 53, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateLabel("Current IP:", 8, 72, 54, 17)
$L_IP = GUICtrlCreateLabel("Please Wait", 64, 72, 101, 17)
GUICtrlCreateGroup("Status", 8, 96, 153, 49)
$L_Status = GUICtrlCreateLabel("Nothing...", 20, 120, 140, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("Time Changer", 168, 0, 185, 145)
$I_Delay = GUICtrlCreateInput("1800", 224, 22, 113, 21)
GUICtrlCreateLabel("Delay:", 176, 24, 34, 17)
$B_Start = GUICtrlCreateButton("Start", 176, 56, 75, 25)
$B_Stop = GUICtrlCreateButton("Stop", 264, 56, 75, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("Status", 176, 88, 169, 49)
$L_StatusT = GUICtrlCreateLabel("Nothing...", 190, 112, 145, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
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) * 1000) Then
_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
|
#3
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
danke, aber das problem ist damit leider nicht gelöst.
|
|
|
12/28/2010, 18:13
|
#4
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
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
|
#5
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
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
|
#6
|
elite*gold: 2
Join Date: Mar 2008
Posts: 1,778
Received Thanks: 1,222
|
Quote:
Originally Posted by KillerDeluxe
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
|
#7
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
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
|
#8
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
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
|
#9
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
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
|
#10
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
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
|
#11
|
elite*gold: 2
Join Date: Mar 2008
Posts: 1,778
Received Thanks: 1,222
|
Ja, deshalb ja die Timer Funktionen...
|
|
|
12/29/2010, 19:20
|
#12
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
Quote:
Originally Posted by KillerDeluxe
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", 360, 155)
GUICtrlCreateGroup("Simple Changer", 8, 0, 153, 57)
$B_Change = GUICtrlCreateButton("Change", 16, 24, 75, 25)
GUICtrlCreateLabel("or Num1", 96, 32, 53, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateLabel("Current IP:", 8, 72, 54, 17)
$L_IP = GUICtrlCreateLabel("Please Wait", 64, 72, 101, 17)
GUICtrlCreateGroup("Status", 8, 96, 153, 49)
$L_Status = GUICtrlCreateLabel("Nothing...", 20, 120, 140, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("Time Changer", 168, 0, 185, 145)
$I_Delay = GUICtrlCreateInput("1800", 224, 22, 113, 21)
GUICtrlCreateLabel("Delay:", 176, 24, 34, 17)
$B_Start = GUICtrlCreateButton("Start", 176, 56, 75, 25)
$B_Stop = GUICtrlCreateButton("Stop", 264, 56, 75, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("Status", 176, 88, 169, 49)
$L_StatusT = GUICtrlCreateLabel("Nothing...", 190, 112, 145, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
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) * 1000) Then
_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?):
PHP Code:
Func _Change($Label = $L_Status)
Das man einer Funktion Parameter geben kann sollte jedem klar sein. In dieser Funktion ist "$L_Status" einfach der Standardparameter. Würde diese Funktion keinen Standardparameter haben könnte man die Funktion nicht mit "_Change()" (Zeile 39) aufrufen, sondern müsste "_Change($L_Status)" benutzen.
PHP Code:
Func _ChangeH()
Die Funktion gibt es aus 2 Gründen. Zum einen kann man Funktionen, die durch Hotkeys aufgerufen werden, keine Parameter mitgeben. Da die Funktion "_Change($Label)" aber einen Parameter besitzt, würdest du nur einen Fehler bekommen. Zum anderen ist in der Funktion aber noch eine Abfrage, man löst die Funktion also nicht permanent aus, wenn man den Hotkey gedrückt hält.
PHP Code:
If $Label == $L_Status Then GUICtrlSetState($B_Change, $GUI_DISABLE)
;...
If $Label == $L_Status Then GUICtrlSetState($B_Change, $GUI_ENABLE)
Hier wird geprüft, ob das Label "$L_Status ist". Wird die Funktion durch den Button oder dem Hotkey ausgelöst, wird der Button "$B_Change" zunächst deaktiviert und nach dem Reconnect wieder aktiviert. Ist der Parameter "$L_StatusT" wird am Button "$B_Change" nichts geändert.
PHP Code:
If $Hotkey == False Then $Hotkey = True
Hier wird einfach geprüft, ob die globale Variable "False" ist. Ist die Bedingung erfüllt wird die Variable auf "True" gesetzt. Die Variable wird für den Hotkey benutzt. Theoretisch hätte man aber auch einfach "$Hotkey = True" nehmen können.
Wenn du dir die Hilfe zu "TimerInit()" und "TimerDiff()" anguckst, sollte der Rest auch verständlich sein.
Zum Vergleich benutze ich "==", bei AutoIt könntest du aber auch je nach Situation "=" benutzen. Die meisten benutzen nur "=", aber auch bei AutoIt gibt es einen Unterschied zwischen "=" und "==".
|
|
|
12/29/2010, 19:38
|
#13
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
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
|
#14
|
elite*gold: 2
Join Date: Mar 2008
Posts: 1,778
Received Thanks: 1,222
|
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
|
#15
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
da is doch kein sleep 0.0
|
|
|
 |
|
Similar Threads
|
Probleme mit den Schleifen x.x
07/23/2010 - AutoIt - 18 Replies
Ja, hallo. :D
Mein Problem ist das ich gerne einen Bot bauen würde der einnen Tastendruck ausführt wenn sich ein bestimmer Pixel auf dem Bildschirm verändert.
Nur ist das Problem das AutoIt zu lahm ist da der Pixel sich schnell beweget und somit auch seine Farbe ändert und der Bot dann es nichtmehr schafft zuzuschlagen. :P
Was ich nun versucht hab ist das man vll. sozusagen eine Tolleranz einbaut wie z.b. bei dem Pixelsearch Befehl nur ich hab ka. wie ich das anstellen soll.
Ich...
|
Auto-Schleifen [Problem]
06/23/2010 - Off Topic - 10 Replies
Hallo,
und zwar brauche ich Informationen über das Schleifen.
Am besten wäre folgendes:
Woher kommt das Schleifen?
Wie schleift man richtig?
|
AutoIt - Frage/Problem bei den Schleifen!!
04/05/2010 - AutoIt - 6 Replies
Nabend,
ich hätte da mal eine kleine Frage zum unterbrechen von Endlosschleifen.
Und nein, damit meine ich nicht einfach den Befehl "Exitloop"!
Also, ich werde mal anhand eines kleinen Test-Scripts versuchen, meine Frage zu erklären:
#include <GUIConstants.au3>
#Region ### START Koda GUI section ### Form=
|
Exitloop Problem mit mehreren Schleifen
10/21/2009 - AutoIt - 5 Replies
Abend !
und zwar sieht mein Problem wie folgt aus:
While 1=1
(das script)
If...Then
-hier ist das problem: ich möchte das das programm die while schleife sozusagen pausiert
-dann das was gemacht werden soll
|
All times are GMT +1. The time now is 01:45.
|
|