Unterbrechung von Funktionen vermeiden

  • 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.

    Einmal editiert, zuletzt von hompidomp (15. April 2012 um 20:53)

  • 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.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • [autoit]

    Local $ready = False
    Local $done = False

    [/autoit][autoit][/autoit][autoit]

    AdlibRegister('Ueberpruefen', 50) ;WARTESCHLEIFE

    [/autoit][autoit][/autoit][autoit]

    Funktion3()

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(50)
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func Funktion1()
    ;IRGENDWAS
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func Funktion2()
    ;IRGENDWAS
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func Funktion3()
    If $ready = False Then Return $done = False
    ;MUSS WARTEN ALSO...
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func Ueberpruefen()
    If $ready And Not $done Then
    Funktion3()
    $done = True
    Else
    $done = False
    EndIf
    EndFunc

    [/autoit]

    So 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
    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
    EndFunc

    [/autoit]

    So, 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]
    Local $ready1 = False
    Local $ready2 = False
    Local $done = False
    Local $paraFun3[4]

    [/autoit] [autoit][/autoit] [autoit]

    AdlibRegister('Ueberpruefen', 50)

    [/autoit] [autoit][/autoit] [autoit]

    Funktion1(1)
    Funktion2(10, 10, 10)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(50)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Funktion1($parameter)
    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 ;==>Funktion1

    [/autoit] [autoit][/autoit] [autoit]

    Func Funktion2($updateposa, $updateposb, $parameter)
    $array[$updateposa][$updateposb] = $parameter
    $ready2 = True
    EndFunc ;==>Funktion2

    [/autoit] [autoit][/autoit] [autoit]

    Func Funktion3($p1, $p2, $p3, $p4)
    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 ;==>Funktion3

    [/autoit] [autoit][/autoit] [autoit]

    Func Ueberpruefen()
    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 ;==>Ueberpruefen

    [/autoit]

    Erweitere 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
    Global $aArray[1]

    [/autoit] [autoit][/autoit] [autoit]

    _Funktion1(10)

    [/autoit] [autoit][/autoit] [autoit]

    Func _Funktion1($variablerParam)
    _Funktion2()
    For $x=0 to UBound($aArray)-1
    $aArray[$x]*=$variablerParam
    _Funktion3()
    Next
    $fReady=True
    _Funktion3()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Funktion2()
    ; mache irgendwas
    $aArray[0]=5
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Funktion3()
    If $fReady Then
    ; tue das, was erst nach Funktion 1 und Funktion 2 getan werden darf
    MsgBox(0, "", "jetzt!")
    EndIf
    EndFunc

    [/autoit]

    Edit:
    oder mit 2 Prüfvariablen:

    Spoiler anzeigen
    [autoit]

    Global $fReady1=False, $fReady2=False
    Global $aArray[50]

    [/autoit] [autoit][/autoit] [autoit]

    _Funktion2()
    _Funktion1(10)

    [/autoit] [autoit][/autoit] [autoit]

    Func _Funktion1($variablerParam)
    For $x=0 to UBound($aArray)-1
    $aArray[$x]*=$variablerParam
    _Funktion3()
    Next
    $fReady1=True
    _Funktion3()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Funktion2()
    ; mache irgendwas
    For $x=0 to UBound($aArray)-1
    $aArray[$x]+=Random(0, 2,1)
    Next
    $fReady2=True
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Funktion3()
    If $fReady1 And $fReady2 Then
    ; tue das, was erst nach Funktion 1 und Funktion 2 getan werden darf
    MsgBox(0, "", "jetzt!")
    EndIf
    EndFunc

    [/autoit]

    mfg
    Developer30

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Dann setz das Thema auf "gelöst". Einfach deinen ersten Post bearbeiten.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.