Syntax: THREADCALL Prozedurname [(Parameterliste)]
Typ: Funktion
Kategorie: Programmorganisation
Diese Funktion existert erst ab FreeBASIC v0.24 !
THREADCALL startet eine Prozedur Ihres Programmes als eigenständigen Thread.
- 'Prozedurname' ist der Name einer SUB, die unabhängig vom Hauptprogramm arbeiten soll.
- 'Parameterliste' enthält die Parameter, die an die SUB übergeben werden sollen. Sie ist identisch mit der Parameterliste, die bei einem normalen Aufruf der SUB übergeben werden muss. Die Klammern um die Parameterliste sind erforderlich, außer die Parameterliste ist leer.
- Der Rückgabewert ist ein ANY PTR und gibt den Handle an, der den Thread identifiziert. Später kann der Thread über diesen Handle angesprochen werden. Ist der Rückgabewert gleich null, so trat ein Fehler auf; kein Thread wurde gestartet.
THREADCALL arbeitet ähnlich wie THREADCREATE. Wird eine Prozedur mit THREADCALL aufgerufen, so wird sie in einem neuen Thread gestartet und gleichzeitig mit dem Code ausgeführt, von dem sie aufgerufen wurde. Das Betriebssystem erreicht diese Gleichzeitigkeit, indem es die Prozedur einem anderen Prozessor zuweist, sofern einer vorhanden ist, oder indem es die Wartezeiten des Hauptprogrammes ausnutzt.
Bevor Sie Ihr Programm beenden, müssen Sie mit THREADWAIT auf die Beendigung aller Threads warten, die von ihm aufgerufen wurden.
THREADCALL ist eine einfachere Methode, Threads zu erstellen, und erlaubt die Übergabe von Daten, ohne dass dabei auf globale Variablen oder Pointer zurückgegriffen werden muss. Trotzdem ist die Funktion effizienter und sollte in Programmen verwendet werden, die eine große Zahl an Threads erstellen.
Unter Linux wird die Bibliothek libffi (bzw. das zugehörige devel-Paket) benötigt, um die Funktion verwenden zu können, unter Windows wird die statische Version der Bibliothek mitgeliefert. Da es sich bei libffi um eine externe Bibliothek handelt, sollte die Lizenz beachtet werden.
Obwohl die meisten Prozeduren unterstützt werden, können folgende Prozeduren nicht mit THREADCALL gestartet werden:
- Prozeduren mit einer variablen Argumentenzahl
- Prozeduren mit UNIONs, die BYVAL übergeben werden
- Prozeduren mit UDTs, die UNIONs, Arrays, Strings oder Bitfelder enthalten und BYVAL übergeben werden
Beispiel:
Sub thread(id As String, tlock As Any Ptr, anzahl as Integer = 5)
For i As Integer = 1 To anzahl
MutexLock tlock
Print "Schleife "; id; " befindet sich im Durchlauf Nr. "; i
MutexUnlock tlock
Sleep 1
Next
End Sub
Dim tlock As Any Ptr = MutexCreate()
Dim a As Any Ptr = ThreadCall thread("A", tlock)
Dim b As Any Ptr = ThreadCall thread("B", tlock, 7)
ThreadWait a
ThreadWait b
MutexDestroy tlock
Print "Fertig (und das ohne die Verwendung von DIM SHARED!)"
Mögliche Ausgabe:
Schleife B befindet sich im Durchlauf Nr. 1
Schleife A befindet sich im Durchlauf Nr. 1
Schleife B befindet sich im Durchlauf Nr. 2
Schleife A befindet sich im Durchlauf Nr. 2
Schleife B befindet sich im Durchlauf Nr. 3
Schleife A befindet sich im Durchlauf Nr. 3
Schleife B befindet sich im Durchlauf Nr. 4
Schleife A befindet sich im Durchlauf Nr. 4
Schleife B befindet sich im Durchlauf Nr. 5
Schleife A befindet sich im Durchlauf Nr. 5
Schleife B befindet sich im Durchlauf Nr. 6
Schleife B befindet sich im Durchlauf Nr. 7
Fertig (und das ohne die Verwendung von DIM SHARED!)
Unterschiede zu QB: neu in FreeBASIC
Plattformbedingte Unterschiede:
- THREADCALL existiert nicht unter DOS, da DOS kein Multithreading unterstützt.
- Unter Linux starten Threads immer in der Reihenfolge, in der sie erstellt wurden. Unter Win32 kann dies nicht vorausgesetzt werden.
- Unter Linux werden die Aufrufkonventionen STDCALL und PASCAL nicht unterstützt.
- Unter Windows wird die Aufrufkonvention PASCAL nicht unterstützt.
Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.24
Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht THREADCALL nicht zur Verfügung.
Siehe auch:
THREADCREATE, Multithreading