Gibt es einen einfachen Weg um zu verhindern dass eine Funktion unterbrochen wird?
Ich habe zwei Funktionen die Daten in ein Array schreiben, das von einer dritten ausgelesen wird. Nun will ich nicht, dass die dritte Funktion ausgeführt wird bevor Funktion 1 oder 2 fertig ist.
Die 3. Funktion wird unvorhersehbar und extern aufgerufen.
Den Rest des Skriptes kenne ich nicht, da es eine UDF ist.
Das Problem ist, dass die Funktion 3 trotzdem ausgeführt werden muss, aber dann eben nach den anderen, außerdem erhält sie einen Parameter. Und eine Schleife kann ich nicht verwenden, da es nur ein Control ist und daher eventbasiert laufen muss.
Unterbrechung von Funktionen vermeiden
-
- [ offen ]
-
hompidomp -
15. April 2012 um 20:41 -
Geschlossen -
Erledigt
-
-
Es gibt ein Auto das hat ein Licht aber das Licht ist anders als das andere Licht das dort angehen soll.
Merkst du was? Genau ohne Code kann man dir nicht helfen.
-
[autoit]
Local $ready = False
[/autoit][autoit][/autoit][autoit]
Local $done = FalseAdlibRegister('Ueberpruefen', 50) ;WARTESCHLEIFE
[/autoit][autoit][/autoit][autoit]Funktion3()
[/autoit][autoit][/autoit][autoit]While 1
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Sleep(50)
WEndFunc Funktion1()
[/autoit][autoit][/autoit][autoit]
;IRGENDWAS
EndFuncFunc Funktion2()
[/autoit][autoit][/autoit][autoit]
;IRGENDWAS
EndFuncFunc Funktion3()
[/autoit][autoit][/autoit][autoit]
If $ready = False Then Return $done = False
;MUSS WARTEN ALSO...
EndFuncFunc Ueberpruefen()
[/autoit]
If $ready And Not $done Then
Funktion3()
$done = True
Else
$done = False
EndIf
EndFuncSo sieht das Grundgerüst aus. Da du keinen Code preis gibst, muss du das selber implementieren.
Müsste von der Überlegung her korrekt sein. -
[autoit]
#include-once
[/autoit]
Global $array[1000][1000]
GUIRegisterMsg($WM_Paint,"Funktion3")
Func Funktion1($parameter)
For $i1 = 0 To 1000
For $i2 = 0 To 1000
$array[$i1][$i2] = $parameter*Random()
Next
Next
Return(1)
EndFunc
Func Funktion2($updateposa,$updateposb,$parameter)
$array[$updateposa][$updateposb] = $parameter
EndFunc
Func Funktion3()
$arraylocal = $array
EndFuncSo, das ist rein theoretischer Code ohne Zweck. Wenn nun mitten während der Funktion 1 die Funktion 3 aufgerufen wird, erhält Funktion 3 invalide/inaktuelle Daten.
EDIT: Wie ich glaube ich schon erwähnt habe, habe ich einen variablen Parameter. Daher kann ich AdlibRegister wohl nicht verwenden, oder übersehe ich da was?
-
Hab das so gemacht:
Spoiler anzeigen
[autoit]Local $array[100][100]
[/autoit] [autoit][/autoit] [autoit]
Local $ready1 = False
Local $ready2 = False
Local $done = False
Local $paraFun3[4]AdlibRegister('Ueberpruefen', 50)
[/autoit] [autoit][/autoit] [autoit]Funktion1(1)
[/autoit] [autoit][/autoit] [autoit]
Funktion2(10, 10, 10)While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(50)
WEndFunc Funktion1($parameter)
[/autoit] [autoit][/autoit] [autoit]
For $i1 = 0 To 100 - 1
For $i2 = 0 To 100 - 1
$array[$i1][$i2] = $parameter * Random()
Next
Next
Funktion3('852875', '2546556', '151', '51541') ;Wird mittendrin aufgerufen
Sleep(1000) ;Pause
$ready1 = True
Return 1
EndFunc ;==>Funktion1Func Funktion2($updateposa, $updateposb, $parameter)
[/autoit] [autoit][/autoit] [autoit]
$array[$updateposa][$updateposb] = $parameter
$ready2 = True
EndFunc ;==>Funktion2Func Funktion3($p1, $p2, $p3, $p4)
[/autoit] [autoit][/autoit] [autoit]
If $ready1 = False Or $ready2 = False Then
$paraFun3[0] = $p1
$paraFun3[1] = $p2
$paraFun3[2] = $p3
$paraFun3[3] = $p4
Return $done = False
EndIf
$arraylocal = $array
MsgBox(0, 'Parameter in Func3', $p1 & ' - ' & $p2 & ' - ' & $p3 & ' - ' & $p4)
EndFunc ;==>Funktion3Func Ueberpruefen()
[/autoit]
If $ready1 And $ready2 And Not $done Then
Funktion3($paraFun3[0], _
$paraFun3[1], _
$paraFun3[2], _
$paraFun3[3])
$done = True
$ready1 = False
$ready2 = False
Else
$done = False
EndIf
EndFunc ;==>UeberpruefenErweitere es am besten so, dass die Funktion3 sozusagen in eine Warteschleife gerät. Sowas wie ne queue
-
wieso eigentlich mit Adlib? so ginge doch auch:
Spoiler anzeigen
[autoit]Global $fReady=False
[/autoit] [autoit][/autoit] [autoit]
Global $aArray[1]_Funktion1(10)
[/autoit] [autoit][/autoit] [autoit]Func _Funktion1($variablerParam)
[/autoit] [autoit][/autoit] [autoit]
_Funktion2()
For $x=0 to UBound($aArray)-1
$aArray[$x]*=$variablerParam
_Funktion3()
Next
$fReady=True
_Funktion3()
EndFuncFunc _Funktion2()
[/autoit] [autoit][/autoit] [autoit]
; mache irgendwas
$aArray[0]=5
EndFuncFunc _Funktion3()
[/autoit]
If $fReady Then
; tue das, was erst nach Funktion 1 und Funktion 2 getan werden darf
MsgBox(0, "", "jetzt!")
EndIf
EndFuncEdit:
oder mit 2 Prüfvariablen:Spoiler anzeigen
[autoit]Global $fReady1=False, $fReady2=False
[/autoit] [autoit][/autoit] [autoit]
Global $aArray[50]_Funktion2()
[/autoit] [autoit][/autoit] [autoit]
_Funktion1(10)Func _Funktion1($variablerParam)
[/autoit] [autoit][/autoit] [autoit]
For $x=0 to UBound($aArray)-1
$aArray[$x]*=$variablerParam
_Funktion3()
Next
$fReady1=True
_Funktion3()
EndFuncFunc _Funktion2()
[/autoit] [autoit][/autoit] [autoit]
; mache irgendwas
For $x=0 to UBound($aArray)-1
$aArray[$x]+=Random(0, 2,1)
Next
$fReady2=True
EndFuncFunc _Funktion3()
[/autoit]
If $fReady1 And $fReady2 Then
; tue das, was erst nach Funktion 1 und Funktion 2 getan werden darf
MsgBox(0, "", "jetzt!")
EndIf
EndFuncmfg
Developer30 -
Ok, denke das kann geschlossen werden, hab ja jetzt einige Möglichkeiten.
-
Dann setz das Thema auf "gelöst". Einfach deinen ersten Post bearbeiten.