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
DatenText as String =Download("www.myysite.de/daten.txt")
sondern über den Umweg RESULT ausgelesen werden können:
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:
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:
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:
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:
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.