Register for your free account! | Forgot your password?

Go Back   elitepvpers › Coders Den › AutoIt
You last visited: Today at 16:42

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



ProcessExist schleife

Discussion on ProcessExist schleife within the AutoIt forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jun 2010
Posts: 42
Received Thanks: 20
ProcessExist schleife

Moinsen!

Ich hab da mal ein Problem ^^ Ich versuche ein Programm zu schreiben, das überprüft ob 2 Prozesse am laufen sind, und wenn beide Prozesse geschlossen sind einen davon startet. mein Code sieht aktuell so aus:

Code:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit


		Case $Start
			ConsoleWrite(Check1())

	EndSwitch

WEnd

Func Check1()
	If ProcessExists ("Beispiel2.exe") Then
		Sleep (500)
		consolewrite (Check1())
	Else
		Sleep (500)
		consolewrite (Check2())
	EndIf

	EndFunc

Func Check2()
	If ProcessExists ("Beispiel.exe") Then
		 Sleep (500)
		 Consolewrite(Check1())

	Else
		Sleep (500)
		Run(@DesktopDir & "\Beispiel.exe")
		ConsoleWrite(Check1())
	EndIf
	EndFunc
An sich funktioniert das ganze auch, das Problem ist nur, dass nach etwa 10-15 Minuten ein Fehler auftritt: "Recursion level has been exceeded - AutoIt will quit to prevent overflow".... Ich selbst habe keine Ideen mehr wie ich das anders umsetzen kann, deshalb wende ich mich an euch. Gibt es da einen weg oder muss ich mich da mit einer anderen Sprache beschäftigen?

MFG Alvin
AlvinX2 is offline  
Old   #2
 
YatoDev's Avatar
 
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
dadurch :
Code:
Consolewrite(Check1())
rufst du immer wieder die func Check1() auf
Wenn das zu oft passiert stürzt autoit ab
YatoDev is offline  
Old   #3
 
elite*gold: 0
Join Date: Jun 2010
Posts: 42
Received Thanks: 20
Jo so soll das ja sein, das Script soll immerwieder Checken ob die beiden Programme noch laufen, bis das Script beendet wird, deshalb wird am ende immer wieder der anfang aufgerufen. Ich hab mir das so gedacht wie bei den Batch dateien damals, mit den Goto befehlen.

:1
Check ob Prozess 1 Läuft
-> Wenn ja goto 1
-> Wenn nein goto 2
:2
Check ob Prozess 2 Läuft
-> Wenn ja goto 1
-> Wenn nein Starte Prozess 2
-> Goto 1
AlvinX2 is offline  
Old   #4
 
YatoDev's Avatar
 
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
das geht in keiner sprache so ^^
PHP Code:
Func Main()
While 
True
Check1
()
Check2()
WEnd
EndFunc
Func Check1
()
    If 
ProcessExists ("Beispiel2.exe") Then
        Sleep 
(500)
        
consolewrite ("existiert")
    Else
        
Sleep (500)
        
consolewrite ("existiert nicht")
    EndIf

    
EndFunc

Func Check2
()
    If 
ProcessExists ("Beispiel.exe") Then
         Sleep 
(500)
         
Consolewrite("existiert")

    Else
        
Sleep (500)
        
Run(@DesktopDir & "\Beispiel.exe")
        
ConsoleWrite("existiert nicht")
    EndIf
    
EndFunc 
die func main rufst du dann 1 mal bei dem button auf
YatoDev is offline  
Old   #5
 
elite*gold: 0
Join Date: Jun 2010
Posts: 42
Received Thanks: 20
So wie ich das sehe benutzt du consolewrite da nur um in die Konsole nen output zu geben, falls dem so ist habe ich da was falsch verstanden, ich dachte das braucht man, um eine Funktion abzurufen. Einen Output solls so eigentlich garnicht geben, ich will nur, dass wenn beide Prozesse geschlossen sind prozess 2 gestartet wird.
AlvinX2 is offline  
Old   #6
 
omer36's Avatar
 
elite*gold: 0
Join Date: Mar 2009
Posts: 2,317
Received Thanks: 1,255
so?
PHP Code:
$bCheck = False

While 1
    $nMsg 
= GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Start
            $bCheck 
= not $bCheck
    
EndSwitch
    If 
$bCheck Then
        
If Not ProcessExists("Beispiel2.exe") And Not ProcessExists("Beispiel.exe") Then 
;~             Run(@DesktopDir & "\Beispiel.exe")
            
ShellExecute(@DesktopDir & "\Beispiel.exe")
        EndIf
    EndIf

WEnd 
omer36 is offline  
Thanks
1 User
Old   #7
 
elite*gold: 0
Join Date: Jun 2010
Posts: 42
Received Thanks: 20
Scheint soweit zu gehen, vielen Dank omer36 ♥
AlvinX2 is offline  
Old   #8
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
das problem bei einem funktionsaufruf wie deinem ist, das die funktion beim rekusionsvorgang noch nicht beendet ist.

erstellen wir ein einfaches vergleichsbeispiel:
Code:
Rekursion()
Func Rekursion($a=0)
	If $a>=10 Then Return 1
	Rekursion($a+1)
EndFunc
so können wir durch zwei einfache ausgaben eindeutig sehen, das es bei dieser rekursionsform eine hin und eine rückrichtung gibt:
Code:
Rekursion()
Func Rekursion($a=0)
	If $a>=10 Then Return 1
	ConsoleWrite('Hin: '&$a&@CRLF)
	Rekursion($a+1)
	ConsoleWrite('Rück: '&$a&@CRLF)
EndFunc
das ganze läuft dann folgendermaßen ab...
Code:
- Rekursion wird ohne parameter aufgerufen -> $a=0
- es wird geprüft ob $a >= 10 ist -> $a<10
- es wird "Hin: $a" ausgegeben
- Rekursion wird mit incrementiertem $a aufgerufen
- da die funktion nicht beendet ist (weder EndFunc noch Return noch Exit wurden aufgerufen)
   muss der aktuelle zustand der funktion im stack abgelegt werden, um sie später fortzusetzen
- durchführung von Rekursion mit inkrementiertem $a
- ... wiederholt sich bis $a>=10 ist ...
- Return greift, die funktionen werden in umgekehrter reihenfolge zuende ausgeführt ($a dekrementiert in jedem schritt, bis wir wieder beim ausgangszustand sind)
setzen wir hier keinen ausstiegspunkt der rekursion, so wird in jedem durchlauf erneut der stack belasted, bis er irgendwann sein limit erreicht hat.

theoretisch könnten wir das ganze problem mit einem einfachen zusatzbefehl lösen:
Code:
Rekursion()
Func Rekursion($a=0)
	If $a>=10 Then Return 1
	ConsoleWrite('Hin: '&$a&@CRLF)
	Return Rekursion($a+1)
	ConsoleWrite('Rück: '&$a&@CRLF)
EndFunc
da die funktion beim erneuten aufruf von Rekursion bereits beendet ist, braucht hier nichts im stack gespeichert werden. (der rückweg ist ja abgeschnitten)

leider ist der interpreter von autoit aber nicht in der lage dies zu erkennen und sichert den aktuellen zustand trotzdem im stack, wodurch auch dies praktisch zu keinem erfolg führt. somit sind wir in autoit leider auf die verwendung von iterativen endlosschleifen beschränkt.
lolkop is offline  
Reply


Similar Threads Similar Threads
Quest-> Schleife in einer Schleife?
04/15/2013 - Metin2 Private Server - 3 Replies
Hallo Community, ist es möglich in einer bestehenden Schleife eine weitere einzufügen die unabhängig von der 1. schleife agiert?
10 mal Schleife, dann 5 Sekunden Pause, dann wieder 10 mal Schleife, ...
05/06/2012 - AutoIt - 6 Replies
Hallo, wie mache ich es, dass nach 10 Mal Schleife einmal Sleep (5000) gemacht wird? Danach soll die Schleife wieder aufgenommen werden. LG Zottel
php while schleife!
03/02/2012 - Web Development - 4 Replies
hallo leute, stehe vor einem problem und zwar: ich wollte heute aus meiner datenbank einen datensatz aus der datenbank abfragen der zuvor mit implode und mit einem kommar getrennt eingespeichert wurde. Nun wollte ich das ganze auf der website wieder ausgeben lassen indem ich die strings wieder mit explode trenne und wieder mit einer while schleife ausgebe Aber irgendwie will das nicht klappen, wäre cool wenn ihr mir da helfen könntet bin noch anfänger :).... Ps. Zum richtigen...
While Schleife
07/03/2011 - AutoIt - 9 Replies
Hallo Leute, Ich hoffe das dieser Thread nicht unnötigen Spam erzeugt. Ich bin ein absoluter Anfänger in Sachen AI. Ich würde gerne wissen wie ich eine While Schleife mit der Leertaste erstelle, das der Bot durchgehend die Leertaste drückt. Danke euch schon mal :) Mfg Daarmy
while-schleife cast x | schleife ende cast y
07/26/2010 - Diablo 2 Programming - 6 Replies
ich kann nicht einschlafen und versuche gerade halbwach herauszufinden, wie ich den bot etwas casten lassen kann, um ihn anschließend nach 10-15 casts etwas anderes casten zu lassen. if(NTA_GetResistance(target, NTA_DAMAGE_PHYSICAL) >= 100) { if((target.name == "Pindleskin") && NTA_GetResistance(target, NTA_DAMAGE_PHYSICAL) >= 100) { var i =0; while(i<15) { return NTC_CastSkill(106, NTC_HAND_LEFT, target); i++;



All times are GMT +1. The time now is 16:43.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.