Seite 1 von 1

Thread_Std (Basis-Threadverwaltung) [Include]

Verfasst: 14.02.2011 18:00
von cxAlex
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:
  • Eine Schutzmutex für geteilte Thread-Ressourcen
  • Einen sicheren Weg den Thread zu beenden
Dieses kleine Include bietet einen finde ich sehr komfortablen und einfachen Weg das zu bewerkstelligen:

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)
Gruß, Alex