German Resumable Sub

FlyingEagle

Member
Licensed User
Longtime User
Hi,

Könnte mir jemand hier bitte mal den Sinn und Zweck von Resumable Subs erklären?
Ich bräuchte sowas wie Function aber irgendwie scheint es das nicht zu sein.

Ich habe das hier bin daraus aber nicht schlau geworden.

Danke
 

FlyingEagle

Member
Licensed User
Longtime User
Im klassischen VB(.net) gib es Sub und Function.

Ersteres gibt keine Werte zurück, das zweite kann wie eine Variable verwendet werden und gibt Werte direkt zurück.

Eine Sub in B4A gibt ja einen Werte per Return zurück, außer es ist eine Resumable Sub ... ich habe aber bspw. keine Ahnung wie man unterbindet das eine Sub eine Resumable Sub wird ...
 

DonManfred

Expert
Licensed User
Longtime User
Eine Sub in B4A gibt ja einen Werte per Return zurück
Nur wenn sie so eingestellt ist, dass sie auch etwas zurückliefert.

B4X:
' Keine Rückgabe (defaults to String)
sub test1
end sub
' Liefert STRING
sub test2 as String
return "BLA"
end sub
' Liefert BOOLEAN
sub test3 as Boolean
return true
end sub
keine Ahnung wie man unterbindet das eine Sub eine Resumable Sub wird ...
Wenn Du Sleep oder wait for benutzt geht das nicht anders.
 

FlyingEagle

Member
Licensed User
Longtime User
Das habe ich gemerkt, allerdings, wenn ich eine msgboxasync einbaue mit wait for etc. - was ja so recommended ist, wie kriege ich dann trotzdem was zurück?
das gleiche gilt auch bei httpjob, das ist mist, weil ich so diese aufrufe nicht kapseln kann.

Klar, ich verstehe diese RS noch nicht ... das war ja initial der Grund meines Threads.
 

Midimaster

Active Member
Licensed User
also erst mal gibt es in B4A keinen Unterschied zwischen SUB und FUNCTION mehr. Alles heißen SUB und sind doch eigentlich mehr wie die klassische FUNCTION. Es ist ganz Dir überlassen, ob diese SUB was zurückgeben oder nicht. Schreibst Du ein RETURN in die SUB wird sie auch was zurückgeben. Auch wenn es eine RESUMABLE SUB ist.

Die Funktionen, wie du sie von früher kennst , haben immer gnadenlos gewartet, bis die Aktion fertig war, die sie ausführen sollten. Und daher haben dann auch alle Funktionen warten müssen, die diese Funktion gerufen hatten. Der Klassiker: HolWasVomInternet(). Dein Programm stand still bis das letzte Byte übertragen war. Heutezutage nehmen moderne Funktionen den Befehl an und dann geben sofort die Kontrolle an die aufrufende Funktion zurück, die dann weitermachen könnte. z.b könnten man gleich noch einen zweiten Download starten oder Musik hören, bis die Internetdaten zur Verfügung stehen. Solche Funktionen nennt B4A RESUMABLE SUB. Viele Standard-Funktionen in der B4A-Sprache sind bereits solche Resumable Subs.

Du kannst Dir also nicht mehr sicher sein, dass Deine Ergebnisse schon zur Verfügung stehen, bloß weil es in der aufrufenden Funktion schon weiter geht.

Manchmal ist es auch gar nicht nötig, das gewartet wird, z.b. dann wenn der User eine MsgBox lesen und mit OK bestätigen soll. Da ist es Dir völlig egal, wie lange er dafür braucht und eine Entscheidung hängt davon auch nicht ab.

Manchmal ist es aber dringend nötig, dass das Programm nicht fortgesetzt wird, bevor die Ergebnisse komplett da sind. z.b. weil Du ja anschließend mit diesen Ergebnissen weiterrechnen willst, etc... Das typische Beispiel ist eine MsgBox wo es drei Entscheidungen JA NEIN ABBRUCH gibt.

Für diese Fälle gibt es WAIT FOR. Hiermit kannst Du eine Funktion rufen und anschließend darauf warten, bis sie wirklich fertig ist. Auch solche Funktionen könne ganz normal RETURN-Werte liefern, die dann aber nicht klassisch mit der CodeZeile
B4X:
DatenText as String =Download("www.myysite.de/daten.txt")
sondern über den Umweg RESULT ausgelesen werden können:
B4X:
Dim WarteSub As Resumable Sub = Download("www.myysite.de/daten.txt")
Wait For(WarteSub) Complete (Ergebnis as String)
DatenText as String =Ergebnis

Eine SUB, die eine RESUMABLE SUB aufruft ist automatisch auch gleich wieder eine RESUMABLE SUB. Das merkst Du spätestens dann, wenn eine solche SUB einen Wert mit RETURN zurückliefern soll. Da musst Du dann auch diese Rückgabe nicht mehr klassich, sondern in Stil von WAIT FOR schreiben:

Früher:
B4X:
LeseVor as String = HolDenText(0)

Sub HolDenText(Woher as INT) As String
    If Woher=0 Then
        DatenText as String =Download("www.myysite.de/daten.txt")
    End If
    Return DatenText
End Sub

und jetzt Asynchron:
B4X:
Dim WarteMal As Resumable Sub = HolDenText(0)
Wait For(WarteMal) Complete (WasKommtDa as String)
LeseVor as String = WasKommtDa

Sub HolDenText(Woher as INT) As Resumable Sub
    If Woher=0 Then
       Dim WarteSub As Resumable Sub = Download("www.myysite.de/daten.txt")
       Wait For(WarteSub) Complete (Ergebnis as String)
    End If
   Return Ergebnis
End Sub


Eine asynchrone MessageBox:
B4X:
Dim WarteMal As Resumable Sub = WarteAufEntscheidung()
Wait For(WarteMal) Complete (Entscheidung as INT)
WasWillSie as INT  = Entscheidung


Sub WarteAufEntscheidung() As Resumable Sub
    Msgbox2Async ("Willst Du mit mir gehen?","Love-Box", "JA","VIELLEICHT","NEIN",NULL, False)
    Wait For msgbox_result (Result As Int)
    Return Result
End Sub

und hier noch ein Beispiel für einen HttpJob:
B4X:
    Dim resume As ResumableSub = InternetFileExists(wwwAdresse,"Daten.txt")
    wait for(resume) complete (result As Boolean)
    If result=True Then
        Log("suche erfolgreich")
...

Sub InternetFileExists(Adresse As String,Datei As String) As ResumableSub
    Dim gesamt As String
    Dim MyJob  As HttpJob
    MyJob.Initialize("", Me)     
    MyJob.Download(Adresse)
    Wait For (MyJob) JobDone(MyJob As HttpJob)
    If MyJob.Success Then
        gesamt=MyJob.GetString
    End If
    MyJob.Release
    Return gesamt.Contains(Datei)
End Sub
diese SUB liest ein Unterverzeichnis auf einem Server aus. Der gibt (hoffentlich) eine Liste aller Dateien in diesem Verzeichnis zurück. Die Funktion schaut, ob sich die gesuchte Datei darin befindet und gibt TRUE zurück. (Anmerkung: Das funktioniert nur, wenn es in dem Unterverzeichnis keine "Index.html" oder ähliches) gibt.
 
Last edited:
Top