Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]


Referenz - CONDCREATE

Referenz-Navigation

 

Syntax: handle = CONDCREATE()
Typ: Funktion
Kategorie: Programmorganisation

COND steht für "conditional variable". Ebenso wie Mutexe (siehe MUTEXCREATE) stellen diese eine Möglichkeit dar, Threads (siehe THREADCREATE) zu synchronisieren.

CONDCREATE gibt einen Handle zur COND zurück. Sobald die COND erstellt und die Threads gestartet wurden, kann einer von ihnen angewiesen werden, auf ein COND zu warten (CONDWAIT), bis ein anderer Thread signalisiert, dass er fortfahren darf (CONDSIGNAL). Wenn alle wartenden Threads auf einmal fortgesetzt werden sollen, kann dies mittels BefehlsreferenzeintragCONDBROADCAST geschehen. Bevor das Programm beendet wird, müssen alle CONDs gelöscht werden, um den Speicherplatz freizugeben (BefehlsreferenzeintragCONDDESTROY).

Der Rückgabetyp ist ein ANY PTR. In früheren Versionen von FreeBASIC (vor v0.17) war der Rückgabetyp INTEGER.

Der Unterschied zwischen MUTEXen und CONDs besteht darin, dass ein MUTEX immer reagiert, sobald er entsperrt wird, während auf ein CONDSIGNAL nur reagiert wird, wenn das entsprechende CONDWAIT gerade ausgeführt wird. Ist der Thread noch mit anderen Anweisungen beschäftigt, geht das CONDSIGNAL verloren. Wird ein MUTEX entsperrt, muss der wartende Thread noch nicht einmal beim entsprechenden Zugriff auf den gerade entsperrten MUTEX angekommen sein, damit das MUTEXUNLOCK seine Wirkung zeigt. Das CONDSIGNAL zeigt seine Wirkung nur dann, wenn der wartende Thread auch wirklich gerade an CONDWAIT ist. Es empfielt sich daher, vor dem CONDSIGNAL oder BefehlsreferenzeintragCONDBROADCAST ein

SLEEP 1

einzubauen, um sicherzustellen, dass die Threads bereit sind, das Signal aufzunehmen.

Beispiel 1:

Dim Shared As Any Ptr hThread1, hThread2, hCond
Dim Shared As Integer q

Sub Thread (ByVal z As ZString Ptr)
  Dim As Integer j

  Condwait(hCond)
  ? *z & " gestartet"

  For j = 0 To 9
    Condwait(hCond)
    ? *z & " sendet:"; j
  Next

  q += 1
End Sub

hCond = Condcreate()

hThread1 = ThreadCreate(Cast(Any Ptr,@Thread), @"Thread 1")
hThread2 = ThreadCreate(Cast(Any Ptr,@Thread), @"Thread 2")

Print "Beliebige Taste druecken, um Threads zu starten"
Sleep
Condbroadcast(hCond)
Sleep 1
Print

Do
  Sleep 1
  CondSignal(hCond)
Loop Until q = 2

CondDestroy hCond
ThreadWait(hThread1)
ThreadWait(hThread2)

Sleep

Wie man sehen kann, werden die Threads zeitgleich durch das BefehlsreferenzeintragCONDBROADCAST gestartet; das einzelne CONDSIGNAL wird immer abwechselnd an Thread 1 bzw. Thread 2 gesandt.

Beispiel 2:

Dim i As Integer
Dim Shared hcondready As Any Ptr
Dim Shared hcondstart As Any Ptr
Dim threads(1 To 9) As Any Ptr

Sub MYTHREAD( Byval id As Integer)
  Dim n As Integer

  Print "Thread #"; id; " wartet ... "
  ' Sende Signal, dass dieser Thread bereit ist
  Condsignal hcondready
  ' Warte auf das Start-Signal
  CondWait hcondstart
  ' Die Nummer dieses Threads ausgeben
  For n = 1 To 40
    Print id;
  Next
End Sub

' Erstelle die Cond's
hcondready = Condcreate
hcondstart = Condcreate

If (hcondready = 0) Or (hcondstart = 0) Then
  Print "Cond's konnten nicht erstellt werden!"
  End
End If
Print
Print "READY..."
Print

' Erstelle einige Threads
For i = 1 To 9
  'ThreadCreate(@MYTHREAD, i) funktioniert, erzeugt aber Warnhinweise des FBC
  threads(i) = ThreadCreate(Cast(Any Ptr, @MYTHREAD), Cast(Any Ptr, i))
  If threads(i) = 0 Then
    Print "Threads konnten nicht erstellt werden"
    End
  End If
  ' Warten auf das Signal des Threads, dass er bereit ist
  CondWait hcondready
Next

Print
Print "SET..."
Print

Sleep 1000, 1

Print "GO!"
Print

' Alle Threads gleichzeitig starten
Condbroadcast hcondstart

' Warten, bis alle Threads abgeschlossen wurden
For i = 1 To 9
  ThreadWait threads(i)
Next

Print
Print "done"
GetKey

' Speicher freigeben
If hcondstart Then CondDestroy hcondstart
If hcondready Then CondDestroy hcondready
End

In der DOS-Version von FreeBASIC steht CONDCREATE nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede unter den FB-Dialektformen / zu anderen FB-Versionen:

Unterschiede zu QB: Neu in FreeBASIC

Siehe auch:
BefehlsreferenzeintragCONDDESTROY, BefehlsreferenzeintragCONDWAIT, BefehlsreferenzeintragCONDSIGNAL, BefehlsreferenzeintragCONDBROADCAST, BefehlsreferenzeintragMUTEXCREATE, BefehlsreferenzeintragMUTEXDESTROY, BefehlsreferenzeintragMUTEXLOCK, BefehlsreferenzeintragMUTEXUNLOCK, BefehlsreferenzeintragTHREADCREATE, BefehlsreferenzeintragTHREADWAIT.


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