Thread_Std (Basis-Threadverwaltung) [Include]
Verfasst: 14.02.2011 18:00
Ein weiteres kleines Include das durch meine Arbeit an meinem EasyNetworkManager entstanden ist.
Sobald man mit Hintergrund-Threads arbeitet die ständig laufen und auf irgendwelche Events reagieren, irgendetwas abarbeiten, usw. kommt es immer wieder zur selben Grundstruktur. Man benötigt eigentlich immer:
Gruß, Alex
Sobald man mit Hintergrund-Threads arbeitet die ständig laufen und auf irgendwelche Events reagieren, irgendetwas abarbeiten, usw. kommt es immer wieder zur selben Grundstruktur. Man benötigt eigentlich immer:
- Eine Schutzmutex für geteilte Thread-Ressourcen
- Einen sicheren Weg den Thread zu beenden
Code: Alles auswählen
; ------------------------------------------------------------------------------------
; Thread Std - Funktionen
; PB 4.5+ OS: Windows/Linux/MacOS Architecture: x86/x64
; Author: Alexander Aigner, cxAlex @ purebasic.fr/german
; Standart Funktionen und Strukturen für den Umgang mit Threads
; ------------------------------------------------------------------------------------
; Std - Threadverwaltung
Structure _Thread_Std
GMutex.i ; Globale Schutzmutex für Thread ressourcen
Stop.i ; Stop - Signal
ID.i ; ThreadID
Stoped.a ; Ist der Thread schon gestopt?
EndStructure
; Thread stoppen
Macro Thread_Std_Stop(_Thread)
If Not _Thread#\Stoped
_Thread#\Stop = CreateSemaphore()
WaitSemaphore(_Thread#\Stop)
FreeSemaphore(_Thread#\Stop)
_Thread#\Stoped = #True
EndIf
EndMacro
; Ist ein Stop-Signal da?
Macro Thread_Std_CheckStop(_Thread)
If _Thread#\Stop ; StopSignal
SignalSemaphore(_Thread#\Stop)
ProcedureReturn #True
EndIf
EndMacro
; Thread Deinitialisieren
Macro Thread_Std_DeInit(_Thread)
If Not _Thread#\Stoped
Thread_Std_Stop(_Thread)
EndIf
FreeMutex(_Thread#\GMutex)
EndMacro
; Thread stopen
Macro Thread_Std_Init(_Thread, _Procedure, _Para)
_Thread#\GMutex = CreateMutex()
_Thread\ID = CreateThread(@_Procedure, _Para)
EndMacro
; Include-Ende
; ------------------------------------------------------------------------------------
; Beispiel:
Structure myThread Extends _Thread_Std
List Messages$()
EndStructure
Procedure myThread(*Thread.myThread)
With *Thread
Repeat
; ist ein Stop-Signal da?
Thread_Std_CheckStop(*Thread)
; Messages abarbeiten.
LockMutex(\GMutex)
ForEach \Messages$()
Debug "Thread Message: " + \Messages$()
Next
ClearList(\Messages$())
UnlockMutex(\GMutex)
Delay(5)
ForEver
EndWith
EndProcedure
; Thread - Meldung pushen
Procedure myThread_PushMsg(*Thread.myThread, Message$)
With *Thread
LockMutex(\GMutex)
AddElement(\Messages$()) : \Messages$() = Message$
UnlockMutex(\GMutex)
EndWith
EndProcedure
Define MessageThread.myThread
; Thread starten.
Thread_Std_Init(MessageThread, myThread(), MessageThread)
;Thread-Messages pushen
myThread_PushMsg(MessageThread, "Hallo")
myThread_PushMsg(MessageThread, "Huhu")
Delay(5)
myThread_PushMsg(MessageThread, "Blub Blub")
; ....
; Dem Thread Zeit geben alles anzuzeigen ...
Delay(100)
; Thread anhalten und freigeben
Thread_Std_DeInit(MessageThread)