Referenz - THREADCREATE
Syntax: THREADCREATE (MySub [, Argument] [, Stackgroesse])
Typ: Funktion
Kategorie: Multithreading
THREADCREATE startet eine Prozedur Ihres Programmes als eigenständigen Thread.
- 'MySub' ist ein Pointer zu der SUB, die unabhängig vom Hauptprogramm arbeiten soll. Die Parameterliste dieser SUB muss aus einem einzelnen ANY PTR bestehen, siehe Beispiel unten.
- 'Argument' ist der Integer-Parameter von MySub. Wenn mehr als ein Parameter benötigt wird, kann hier ein Pointer auf eine Array- oder UDT-Struktur übergeben werden. Da 'Argument' BYVAL übergeben wird, kann der Parameter nicht verwendet werden, um ein Ergebnis zurückzuliefern. 'Argument' ist optional; erwartet das Programm, das als Thread gestartet wird, einen Parameter, so wird null übergeben, wenn dieser Parameter ausgelassen wird.
- 'Stackgroesse' ist optional und gibt an, wie viele Byte für den Stack des Thread reserviert werden sollen.
- 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.
Die Prozedur, die als eigener Thread gestartet wurde, läuft parallel zum Hauptprogramm. Das Betriebssystem erreicht dies, 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 aufgerufen 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.
Auf manchen Systemen steigt die Stackgröße automatisch über die angegebene Größe, falls nötig, auf anderen stellt der Wert die absoulte Grenze dar. Wenn auf Systemen, auf denen der Stack nicht automatisch wachsen kann, ein größerer Stack verwendet wird, als reserviert wurde, kann es das Programmverhalten negativ beeinflussen.
Beispiel:
Dim As Any Ptr i
Dim Shared As Any Ptr mutex
Dim As Integer DotCount
Dim Shared As Integer terminate
Sub MyThread (ByVal Parameter as Any Ptr)
Do 'alle 100ms einen "*" ausgeben
Print "*";
Sleep 100, 1
MutexLock(mutex)
If terminate = 1 Then 'abbrechen wenn 1
MutexUnLock(mutex)
Exit Do
EndIf
MutexUnLock(mutex)
Loop
End Sub
Print "Hauptprogramm gibt Punkte aus"
Print "Thread gibt Sterne aus"
Print
terminate = 0
mutex = MutexCreate() 'Mutex, um die terminate-Variable zu schützen
i = ThreadCreate(@MyThread)
Do 'alle 50ms einen "." ausgeben
Print ".";
Sleep 50, 1
DotCount += 1
Loop Until DotCount = 100
MutexLock(mutex)
terminate = 1 'MyThread abbrechen
MutexUnLock(mutex)
Print
Print "Beendevorgang begonnen"
ThreadWait(i) 'warten bis MyThread endet
Print "Thread beendet"
MutexDestroy(mutex)
Sleep
Ausgabebeispiel:
Hauptprogramm gibt Punkte aus
Thread gibt Sterne aus
.*..*..*..*.*..*..*..*..*..*..*..*...*.*..*..*...*.*..*..*...*.*...*.*...*.*..*.
.*...*.*..*..*..*..*..*..*...*.*..*..*...*.*..*..*...*.*..*..*...*.*..*
Beendevorgang begonnen
Thread beendet
Wie Sie sehen, werden die Punkte und Sterne nicht ganz gleichmäßig ausgegeben, obwohl das Zeitverhältnis für Hauptprogramm und Thread konstant bei 2:1 liegt (erreicht durch die beiden SLEEP-Anweisungen). Dies liegt an diversen Prozessen, die das System im Hintergrund beanspruchen und so das Programm beeinflussen. Wenn eine exakte Abstimmung zweier Threads aufeinander nötig ist, muss dies über Mutexe oder Conds erreicht werden.
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.
Unterschiede zu früheren Versionen von FreeBASIC:
- Seit FreeBASIC v0.17 gibt THREADCREATE einen ANY PTR zurück. Davor war es ein INTEGER.
- Seit FreeBASIC v0.17 ist der Parameter 'Argument', der an die Sub übergeben wird, optional.
- THREADCREATE existiert seit FreeBASIC v0.13.
Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht THREADCREATE nicht zur Verfügung.
Siehe auch:
THREADCALL, THREADWAIT, THREADDETACH, Multithreading
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|