Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - THREADCREATE

Referenz-Navigation

 

Syntax: THREADCREATE (MySub [, Argument] [, Stackgroesse])
Typ: Funktion
Kategorie: Multithreading

THREADCREATE startet eine Prozedur Ihres Programmes als eigenständigen Thread.

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 BefehlsreferenzeintragTHREADWAIT 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 BefehlsreferenzeintragMUTEXCREATE sowie BefehlsreferenzeintragCONDCREATE.

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:

Unterschiede zu früheren Versionen von FreeBASIC:

Unterschiede unter den FB-Dialektformen:
In der Dialektform Befehlsreferenzeintrag-lang qb steht THREADCREATE nicht zur Verfügung.

Siehe auch:
BefehlsreferenzeintragTHREADCALL, BefehlsreferenzeintragTHREADWAIT, BefehlsreferenzeintragTHREADDETACH, BefehlsreferenzeintragMultithreading


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 27.07.2007 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 25.08.2020 von Redakteurnemored gespeichert.
  Versionen Versionen