Browse Source

Fehler beim löschen von Threads behoben

Kolja Strohm 5 years ago
parent
commit
afc44433e7

+ 24 - 3
SMP/Programm/Server/Patch/PatchServer.cpp

@@ -21,7 +21,6 @@ PSUpdate::PSUpdate( PatchServer *zPSA, AdminAccount *account )
 // Destruktor
 PSUpdate::~PSUpdate()
 {
-    ende();
     if( psc )
     {
         psc->abbruch();
@@ -305,6 +304,14 @@ void PSUpdate::thread()
     run = 0;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *PSUpdate::release()
+{
+    if( ref == 2 && run )
+        ende();
+    return Thread::release();
+}
+
 
 // Inhalt der PSDetails Klasse aus PatchServer.h
 // Konstruktor
@@ -319,7 +326,6 @@ PSDetails::PSDetails( PatchServer *zPSA, MSKlient *mk )
 // Destruktor
 PSDetails::~PSDetails()
 {
-    ende();
     mk->release();
 }
 
@@ -359,6 +365,14 @@ void PSDetails::thread()
     run = 0;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *PSDetails::release()
+{
+    if( ref == 2 && run )
+        ende();
+    return Thread::release();
+}
+
 
 // Inhalt der PSSuche Klasse aus PatchServer.h
 // Konstruktor
@@ -372,7 +386,6 @@ PSSuche::PSSuche( PatchServer *zPSA, MSKlient *mk )
 // Destruktor
 PSSuche::~PSSuche()
 {
-    ende();
     mk->release();
 }
 
@@ -429,6 +442,14 @@ void PSSuche::thread()
     run = 0;
 }
 
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *PSSuche::release()
+{
+    if( ref == 2 && run )
+        ende();
+    return Thread::release();
+}
+
 
 TextFeld *getTabellenEintrag( const char *txt, Schrift *s, int farbe )
 {

+ 102 - 99
SMP/Programm/Server/Patch/PatchServer.h

@@ -17,130 +17,133 @@ class PatchServer; // PatchServer.h
 class PSUpdate : public Thread
 {
 private:
-	PatchServer *zPSA;
-	AdminAccount *account;
-	PSKlient *psc;
-	int gruppeAnzahl;
-	int *gruppeId;
-	int id;
+    PatchServer *zPSA;
+    AdminAccount *account;
+    PSKlient *psc;
+    int gruppeAnzahl;
+    int *gruppeId;
+    int id;
 
 public:
-	// Kontruktor
-	PSUpdate( PatchServer *zPSA, AdminAccount *account );
-	// Destruktor
-	~PSUpdate();
-	// nicht constant
-	void setServer( const char *ip, unsigned short port );
-	void setUpdateListe( int gAnzahl, Array< int > *gId );
-	virtual void thread();
-	// constant
+    // Kontruktor
+    PSUpdate( PatchServer *zPSA, AdminAccount *account );
+    // Destruktor
+    ~PSUpdate();
+    // nicht constant
+    void setServer( const char *ip, unsigned short port );
+    void setUpdateListe( int gAnzahl, Array< int > *gId );
+    virtual void thread();
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 class PSDetails : public Thread
 {
 private:
-	PatchServer *zPSA;
+    PatchServer *zPSA;
     MSKlient *mk;
-	int id;
+    int id;
 
 public:
-	// Konstruktor
-	PSDetails( PatchServer *zPSA, MSKlient *mk );
-	// Destruktor
-	~PSDetails();
-	// nicht constant
-	void setServerId( int id );
-	virtual void thread();
-	// constant
+    // Konstruktor
+    PSDetails( PatchServer *zPSA, MSKlient *mk );
+    // Destruktor
+    ~PSDetails();
+    // nicht constant
+    void setServerId( int id );
+    virtual void thread();
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 class PSSuche : public Thread
 {
 private:
-	PatchServer *zPSA;
-	MSKlient *mk;
+    PatchServer *zPSA;
+    MSKlient *mk;
 
 public:
-	// Konstruktor
-	PSSuche( PatchServer *zPSA, MSKlient *mk );
-	// Destruktor
-	~PSSuche();
-	// nicht constant
-	virtual void thread();
-	// constant
+    // Konstruktor
+    PSSuche( PatchServer *zPSA, MSKlient *mk );
+    // Destruktor
+    ~PSSuche();
+    // nicht constant
+    virtual void thread();
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 class PatchServer : public Abschnitt
 {
 private:
-	Fenster *fenster;
-	Fenster *liste;
-	Fenster *details;
-	Fenster *updateF;
-	MSKlient *msk;
-	InitDatei *iD;
-	Fenster *f;
-	AdminAccount *account;
-	Knopf *aktualisieren;
-	Knopf *weiter;
-	Knopf *zurück;
-	ObjTabelle *tabelle;
-	ObjTabelle *updateT;
-	PSSuche *suchen;
-	PSDetails *getDetails;
-	PSUpdate *updateTh;
-	Schrift *schrift;
-	PSKlient *psc;
-	TextFeld *serverId;
-	TextFeld *serverName;
-	TextFeld *serverIp;
-	TextFeld *serverPort;
-	TextFeld *serverAPort;
-	TextFeld *serverClients;
-	TextFeld *serverMaxClients;
-	TextFeld *maxClients;
-	TextFeld *serverStatus;
-	TextFeld *serverFehler;
-	Knopf *updateStarten;
-	Knopf *update;
-	Knopf *pausieren;
-	Knopf *stoppen;
-	Knopf *beenden;
-	Knopf *terminieren;
-	Knopf *setMaxClients;
-	Zeichnung *obj;
-	int ref;
+    Fenster *fenster;
+    Fenster *liste;
+    Fenster *details;
+    Fenster *updateF;
+    MSKlient *msk;
+    InitDatei *iD;
+    Fenster *f;
+    AdminAccount *account;
+    Knopf *aktualisieren;
+    Knopf *weiter;
+    Knopf *zurück;
+    ObjTabelle *tabelle;
+    ObjTabelle *updateT;
+    PSSuche *suchen;
+    PSDetails *getDetails;
+    PSUpdate *updateTh;
+    Schrift *schrift;
+    PSKlient *psc;
+    TextFeld *serverId;
+    TextFeld *serverName;
+    TextFeld *serverIp;
+    TextFeld *serverPort;
+    TextFeld *serverAPort;
+    TextFeld *serverClients;
+    TextFeld *serverMaxClients;
+    TextFeld *maxClients;
+    TextFeld *serverStatus;
+    TextFeld *serverFehler;
+    Knopf *updateStarten;
+    Knopf *update;
+    Knopf *pausieren;
+    Knopf *stoppen;
+    Knopf *beenden;
+    Knopf *terminieren;
+    Knopf *setMaxClients;
+    Zeichnung *obj;
+    int ref;
 
 public:
-	// Konstruktor
-	PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild *rb, AdminAccount *acc, Bildschirm *b );
-	// Destruktor
-	~PatchServer();
-	// nicht constant
-	virtual void setFenster( Fenster *f );
-	virtual void setSichtbar( bool s );
-	void addServer( int id, char *name, char *ip, int port, int adminPort, char *status );
-	void sucheAbgeschlossen();
-	void setServerDetails( int id, char *name, char *ip, int port, int adminPort, int clients, int maxClients, int status, Text *error );
-	void setUpdateProzent( int prozent, int gruppe );
-	void setUpdateFertig( bool error, int gruppe );
-	bool aktualisierenMausEreignis( void *o, MausEreignis me );
-	bool auswahlKnopfMausEreignis( void *o, MausEreignis me );
-	bool weiterMausEreignis( void *o, MausEreignis me );
-	bool zurückMausEreignis( void *o, MausEreignis me );
-	bool updateMausEreignis( void *o, MausEreignis me );
-	bool pausierenMausEreignis( void *o, MausEreignis me );
-	bool stoppenMausEreignis( void *o, MausEreignis me );
-	bool beendenMausEreignis( void *o, MausEreignis me );
-	bool terminierenMausEreignis( void *o, MausEreignis me );
-	bool setMaxClientsMausEreignis( void *o, MausEreignis me );
-	bool updateStartenMausEreignis( void *o, MausEreignis me );
-	bool maxClientsTastaturEreignis( void *o, TastaturEreignis te );
-	// constant
+    // Konstruktor
+    PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild *rb, AdminAccount *acc, Bildschirm *b );
+    // Destruktor
+    ~PatchServer();
+    // nicht constant
+    virtual void setFenster( Fenster *f );
+    virtual void setSichtbar( bool s );
+    void addServer( int id, char *name, char *ip, int port, int adminPort, char *status );
+    void sucheAbgeschlossen();
+    void setServerDetails( int id, char *name, char *ip, int port, int adminPort, int clients, int maxClients, int status, Text *error );
+    void setUpdateProzent( int prozent, int gruppe );
+    void setUpdateFertig( bool error, int gruppe );
+    bool aktualisierenMausEreignis( void *o, MausEreignis me );
+    bool auswahlKnopfMausEreignis( void *o, MausEreignis me );
+    bool weiterMausEreignis( void *o, MausEreignis me );
+    bool zurückMausEreignis( void *o, MausEreignis me );
+    bool updateMausEreignis( void *o, MausEreignis me );
+    bool pausierenMausEreignis( void *o, MausEreignis me );
+    bool stoppenMausEreignis( void *o, MausEreignis me );
+    bool beendenMausEreignis( void *o, MausEreignis me );
+    bool terminierenMausEreignis( void *o, MausEreignis me );
+    bool setMaxClientsMausEreignis( void *o, MausEreignis me );
+    bool updateStartenMausEreignis( void *o, MausEreignis me );
+    bool maxClientsTastaturEreignis( void *o, TastaturEreignis te );
+    // constant
 
-	// Reference Counting
-	virtual Abschnitt *getThis();
-	virtual Abschnitt *release();
+    // Reference Counting
+    virtual Abschnitt *getThis();
+    virtual Abschnitt *release();
 };
 
 // Ereignisse

+ 8 - 1
SMP/Render/Render.cpp

@@ -13,7 +13,6 @@ Render::Render( Bildschirm *b )
 // Destruktor
 Render::~Render()
 {
-	beenden( );
 	bildschirm->release();
 }
 
@@ -40,4 +39,12 @@ void Render::beenden()
 {
 	beendet = 1;
 	warteAufThread( 1000 );
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *Render::release()
+{
+    if( ref == 2 && run )
+        beenden();
+    return Thread::release();
 }

+ 11 - 10
SMP/Render/Render.h

@@ -9,18 +9,19 @@ using namespace Framework;
 class Render : public Thread
 {
 private:
-	Bildschirm *bildschirm;
-	bool beendet;
+    Bildschirm *bildschirm;
+    bool beendet;
 
 public:
-	// Konstruktor
-	Render( Bildschirm *b );
-	// Destruktor
-	~Render();
-	// nicht constant
-	virtual void thread();
-	void beenden();
-	// constant
+    // Konstruktor
+    Render( Bildschirm *b );
+    // Destruktor
+    ~Render();
+    // nicht constant
+    virtual void thread();
+    void beenden();
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif