Referenz - THREADCALL
Syntax: THREADCALL Prozedurname [(Parameterliste)]
Typ: Funktion
Kategorie: Multithreading
THREADCALL startet eine Prozedur Ihres Programms 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 Hauptprogramms ausnutzt.
Bevor Sie Ihr Programm beenden, müssen Sie mit THREADWAIT auf die Beendigung aller Threads warten, die von ihm gestartet wurden.
Um mehrere Threads zu synchronisieren, existieren verschiedene Möglichkeiten; sie können entweder über Mutexe aufeinander abgestimmt werden oder auf ein COND-Signal warten. Siehe dazu MUTEXCREATE sowie CONDCREATE.
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 THREADCREATE 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!)"
Sleep
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:
- In der DOS-Version von FreeBASIC steht THREADCREATE nicht zur Verfügung, da Threads nicht unterstützt werden.
- Unter Linux starten Threads in der Reihenfolge, in der sie erstellt wurden. Dies kann unter Windows systembedingt nicht garantiert 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 seit FreeBASIC v0.24
Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht THREADCALL nicht zur Verfügung.
Siehe auch:
THREADCREATE, THREADWAIT, THREADDETACH, Multithreading
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|