GlobalObjects
Lade ...
Suche ...
Keine Treffer
eut::RepeatingThread Klassenreferenzabstract

Basisklasse für einen Thread der seine Arbeit endlos bis zum Abbruch ausführt. Mehr ...

#include <EuRepeatingThread.h>

Klassendiagramm für eut::RepeatingThread:

Öffentliche Typen

enum  EuTHREADERROR { EuTHREAD_ERR_NO_THREAD = -10301 , EuTHREAD_ERR_THREAD_ALREADY_WORKING = -10302 , EuTHREAD_ERR_THREAD_BREAK_COUNT_LESS_THAN_ZERO = -10303 , EuTHREAD_ERR_UNKNOWN = -10400 }
 Fehlerbereich = -10301 bis -10400 Mehr ...
 
enum  ORDER { eUNDEFINED , eDO_WORK , eEXIT }
 
enum  STATUS {
  eAT_THE_START , eWORKING , ePAUSING , eENDING ,
  eCOMPLETED
}
 

Öffentliche Methoden

 RepeatingThread ()
 
virtual ~RepeatingThread ()
 
virtual void cancel ()
 
virtual void finishBreak ()
 
int getBreakCounter ()
 
bool isInExclusiveAccess () const
 
void setExclusiveAccess ()
 
void signalInput ()
 
virtual int start ()
 
RepeatingThread::STATUS status () const
 
virtual void takeABreak ()
 
bool testCancel ()
 
void unsetExclusiveAccess ()
 
void waitForInput ()
 

Öffentliche Attribute

std::string m_strDebugInfo
 

Geschützte Methoden

ORDER getOrder ()
 
STATUS getStatus ()
 
void setStatus (STATUS eStatus)
 
void threadWork ()
 
void toOrder (ORDER eOrder)
 
virtual void work ()=0
 

Private Methoden

 RepeatingThread (const RepeatingThread &)
 
RepeatingThreadoperator= (const RepeatingThread &)
 

Private Attribute

std::condition_variable m_BreakCondVar
 
std::mutex m_BreakMutex
 
ORDER m_eOrder
 
STATUS m_eStatus
 
CriticalSection m_ExclusiveAccessSection
 
int m_iBreakCounter
 
int m_iDataReady
 
std::condition_variable m_InputCondVar
 
std::thread * m_pThread
 
std::mutex m_WaitMutex
 

Ausführliche Beschreibung

Basisklasse für einen Thread der seine Arbeit endlos bis zum Abbruch ausführt.

In Unterklassen muß lediglich die virtuale Methode RepeatingThread::work() überschrieben werden.

Achtung
Der Thread muss nach dem start mit cancel() vor dem Aufruf des Destruktors beendet werden!
Autor
Helmut Jakoby

Dokumentation der Aufzählungstypen

◆ EuTHREADERROR

Fehlerbereich = -10301 bis -10400

Aufzählungswerte
EuTHREAD_ERR_NO_THREAD 

-10301:

Es ist ein erwarteter Thread nicht vorhanden bzw. nicht gestartet.

EuTHREAD_ERR_THREAD_ALREADY_WORKING 

-10302:

Der Threads ist schon gestartet.

EuTHREAD_ERR_THREAD_BREAK_COUNT_LESS_THAN_ZERO 

-10303:

Der Thread wurde zu oft aus dem 'Schlaf' geweckt.

EuTHREAD_ERR_UNKNOWN 

-10400:

Undefinierter Fehler.

◆ ORDER

Einem RepeatingThread können nach dem Start Anweisungen übergeben werden.

Aufzählungswerte
eUNDEFINED 

Undefiniert.

eDO_WORK 

Thread soll arbeiten.

eEXIT 

Thread soll sich beenden.

◆ STATUS

Um den Thread steuern zu können, ist es förderlich, wenn der Arbeitsstatus bekannt ist.

Aufzählungswerte
eAT_THE_START 

Der Threads hat noch nicht gearbeitet.

eWORKING 

Der Threads ist am arbeiten.

ePAUSING 

Der Threads pausiert.

eENDING 

Der Threads beendet gerade seiner Arbeit.

eCOMPLETED 

Der Threads ist mit seiner Arbeit fertig.

Beschreibung der Konstruktoren und Destruktoren

◆ RepeatingThread() [1/2]

eut::RepeatingThread::RepeatingThread ( )

Standartkonstruktor.

◆ ~RepeatingThread()

virtual eut::RepeatingThread::~RepeatingThread ( )
virtual

Destruktor.

Achtung
Es muss vor dem Destruktor die Methode cancel() aufgerufen werden! Da cancel() virtual, kann dieses nicht im dtor ausgeführt werden.

◆ RepeatingThread() [2/2]

eut::RepeatingThread::RepeatingThread ( const RepeatingThread & )
private

Der Copy-Konstruktor steht nicht zur Verfügung.

Dokumentation der Elementfunktionen

◆ cancel()

virtual void eut::RepeatingThread::cancel ( )
virtual

Beendet den Thread.

Achtung
Muss vor dem Destruktor aufgerufen werden, wenn mit start() gestartet! Da cancel() virtual, kann dieses nicht im dtor ausgeführt werden.

Erneute Implementation in tcp::Client, tcp::ClientReceiver, tcp::Server, tcp::ServerAcceptReceiver, tcp::ServerReceiver, tcp::Transmitter, glo::ClientThread, glo::CommunicaterThread, glo::LocalThread, glo::Server und glo::WatchNotifyManager.

◆ finishBreak()

virtual void eut::RepeatingThread::finishBreak ( )
virtual

Beendet die Bearbeitungs-Pause. Muss über takeABreak() initiiert worden sein.

Erneute Implementation in tcp::ReceiverTransmitter.

◆ getBreakCounter()

int eut::RepeatingThread::getBreakCounter ( )

Liefert den Pausenzähler.

Siehe auch
m_iBreakCounter

◆ getOrder()

ORDER eut::RepeatingThread::getOrder ( )
protected

Liefert die letzte übergebene Anweisung.

Rückgabe
Die aktuelle Anweisungen.

◆ getStatus()

STATUS eut::RepeatingThread::getStatus ( )
protected

Liefert den aktuellen Status.

Rückgabe
Der gesetzte Status.

◆ isInExclusiveAccess()

bool eut::RepeatingThread::isInExclusiveAccess ( ) const

Ist der Thread in einem exclusiven Bereich?

Rückgabe
Wenn true, dann im exclusiven Bereich.
Siehe auch
setExclusiveAccess() and unsetExclusiveAccess()

◆ operator=()

RepeatingThread & eut::RepeatingThread::operator= ( const RepeatingThread & )
private

Zuweisungsoperator steht nicht zur Verfügung.

◆ setExclusiveAccess()

void eut::RepeatingThread::setExclusiveAccess ( )

Initiiert eine CriticalSection. Muss mittels unsetExclusiveAccess() wieder aufgehoben werden.

Siehe auch
m_ExclusiveAccessSection

◆ setStatus()

void eut::RepeatingThread::setStatus ( STATUS eStatus)
protected

Setzt den Status.

Parameter
[in]eStatusDer zu setzende Status.

◆ signalInput()

void eut::RepeatingThread::signalInput ( )

Beendet das Warten ohne Tätigkeit, welches durch waitForInput() initiiert wurde.

◆ start()

virtual int eut::RepeatingThread::start ( )
virtual

Startet den Thread.

Rückgabe
Ein Rückgabewert < 0 zeigt einen Fehler an. Z.B. wenn Thread schon läuft.
Achtung
Der Thread muss nach start() vor dem Destruktor mittels cancel() beendet werden.

◆ status()

RepeatingThread::STATUS eut::RepeatingThread::status ( ) const

Liefert den Status des Threads.

Rückgabe
Der Status.

◆ takeABreak()

virtual void eut::RepeatingThread::takeABreak ( )
virtual

Initiiert ein pausieren des Threads um die Bearbeitung zu unterbrechen. Muss durch finishBreak() wieder beendet werden.

Zu beachten
Da der Thread die Bearbeitung nur überspringt (also noch läuft) kann ein echtes Aussetzen des Threads durch Nutzung der Methode waitForInput() in der Methode work() der abgeleiteten Klasse erreicht werden.

Erneute Implementation in tcp::ReceiverTransmitter.

◆ testCancel()

bool eut::RepeatingThread::testCancel ( )

Liefert true, wenn Thread beendet wurde.

Rückgabe
s.o.

◆ threadWork()

void eut::RepeatingThread::threadWork ( )
protected

Diese Methode, vom Thread ausgeführt, ruft in einer Schleife die Methode work() auf.

◆ toOrder()

void eut::RepeatingThread::toOrder ( ORDER eOrder)
protected

Übernimmt die übergebene Anweisung.

Parameter
[in]eOrderDie zu setzende Anweisungen.

◆ unsetExclusiveAccess()

void eut::RepeatingThread::unsetExclusiveAccess ( )

Hebt eine initiierte CriticalSection auf, wenn durch setExclusiveAccess() gesetzt.

Siehe auch
m_ExclusiveAccessSection

◆ waitForInput()

void eut::RepeatingThread::waitForInput ( )

Läßt den Thread an definierter Position ohne Tätigkeit warten. Muss durch signalInput() wieder beendet werden.

Zu beachten
Diese Methode kann in der Methode work() einer abgeleiteten Klasse genutz werden, um den Thread aussetzen zu lasse. Der Thread wacht durch signalInput() wieder auf, was auch in der abgeleiteten Klasse initiiert werden muss.

◆ work()

virtual void eut::RepeatingThread::work ( )
protectedpure virtual

Diese Methode wird vom Thread ausgeführt und muß in Unterklassen überschrieben werden.

Siehe auch
threadWork()

Implementiert in tcp::Client, tcp::ClientReceiver, tcp::Server, tcp::ServerAcceptReceiver, tcp::ServerReceiver, tcp::Transmitter, glo::CommunicaterThread, glo::Communicator, glo::Manager und glo::WatchNotifyManager.

Dokumentation der Datenelemente

◆ m_BreakCondVar

std::condition_variable eut::RepeatingThread::m_BreakCondVar
private

Condition_variable um zu pausieren.

Siehe auch
threadWork(), finishBreak() and m_BreakMutex

◆ m_BreakMutex

std::mutex eut::RepeatingThread::m_BreakMutex
private

Mutex um zu pausieren.

Siehe auch
threadWork() und m_BreakCondVar

◆ m_eOrder

ORDER eut::RepeatingThread::m_eOrder
private

Einem Thread kann ein Befehl gegeben werden der hier gesetzt wird.

◆ m_eStatus

STATUS eut::RepeatingThread::m_eStatus
private

Der Arbeitsstatus.

◆ m_ExclusiveAccessSection

CriticalSection eut::RepeatingThread::m_ExclusiveAccessSection
private

Wird benötigt, um durch RepeatingThread::setExclusiveAccess() bzw. RepeatingThread::unsetExclusiveAccess() zugriffsgeschützte Bereiche zu definieren.

◆ m_iBreakCounter

int eut::RepeatingThread::m_iBreakCounter
private

Wenn ein RepeatingThread pausieren soll, wird dieser Zähler incrementiert. Wenn der Thread wieder aufwachen soll, wird dieser Zähler decrementiert. Bei 0 wird der Thread wieder aufgeweckt.

Damit wird ein geschachteltes schlafen legen und auwecken ermöglicht.

◆ m_iDataReady

int eut::RepeatingThread::m_iDataReady
private

Um "lost wakeup" und "spurious wakeups" zu vermeiden, ist diese Variable notwendig.

◆ m_InputCondVar

std::condition_variable eut::RepeatingThread::m_InputCondVar
private

Condition_variable zum warten auf Eingabe.

Siehe auch
waitForInput(), signalInput() and m_WaitMutex

◆ m_pThread

std::thread* eut::RepeatingThread::m_pThread
private

Der 'echte' Thread.

◆ m_strDebugInfo

std::string eut::RepeatingThread::m_strDebugInfo

Hier kann für DEBUG-Zwecke etwas reingeschrieben werden.

◆ m_WaitMutex

std::mutex eut::RepeatingThread::m_WaitMutex
private

Mutex zum warten auf Eingabe.

Siehe auch
waitForInput() and m_InputCondVar

Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Datei: