Browse Source

Fehler beim löschen von Threads behoben

Kolja Strohm 5 years ago
parent
commit
adb6ed7bf5
5 changed files with 131 additions and 114 deletions
  1. 8 1
      patcher/News.cpp
  2. 2 0
      patcher/News.h
  3. 119 113
      patcher/Patcher.cpp
  4. 2 0
      patcher/Patcher.h
  5. BIN
      patcher/data/start/icon.exe

+ 8 - 1
patcher/News.cpp

@@ -97,7 +97,6 @@ News::News( Bildschirm *zB, Schrift *zS, KSGClient::NewsServerClient *client )
 // Destruktor
 News::~News()
 {
-	warteAufThread( INFINITE );
     if( client )
     {
         client->trenne( 1 );
@@ -192,4 +191,12 @@ void News::thread()
 	laden->setSichtbar( 0 );
 	screen->setOnTop( 0 );
 	run = 0;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *News::release()
+{
+    if( ref == 2 && run )
+        warteAufThread( INFINITE );
+    return Thread::release();
 }

+ 2 - 0
patcher/News.h

@@ -31,6 +31,8 @@ public:
 	// nicht constant
 	void rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret );
 	void thread();
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

+ 119 - 113
patcher/Patcher.cpp

@@ -11,7 +11,7 @@ typedef GSL::GSLDateiV *( *GetGSLDatei )( );
 // Inhalt der Patcher Klasse aus Patcher.h
 // Konstruktor
 Patcher::Patcher( FBalken *fortschritt, TextFeld *status, Knopf *play, bool *close, KSGClient::PatchServerClient *client )
-	: Thread()
+    : Thread()
 {
     if( !client )
     {
@@ -41,147 +41,153 @@ Patcher::Patcher( FBalken *fortschritt, TextFeld *status, Knopf *play, bool *clo
         if( !updater )
             client->release();
     }
-	// Initialisierung
-	this->fortschritt = fortschritt;
-	this->status = status;
-	this->play = play;
-	this->close = close;
-	ret = 0;
+    // Initialisierung
+    this->fortschritt = fortschritt;
+    this->status = status;
+    this->play = play;
+    this->close = close;
+    ret = 0;
 }
 
 // Destruktor
 Patcher::~Patcher()
 {
-	if( run )
-	{
-		*close = 1;
-		warteAufPatch( 5000 );
-	}
-	if( run )
-		ende();
-	fortschritt->release();
-	status->release();
-	play->release();
-	if( updater )
-		updater->release();
-	FreeLibrary( updateDll );
+    fortschritt->release();
+    status->release();
+    play->release();
+    if( updater )
+        updater->release();
+    FreeLibrary( updateDll );
 }
 
 // nicht constant
 void Patcher::startPatch()
 {
-	start();
+    start();
 }
 
 void Patcher::thread()
 {
-	if( !updater )
-	{
-		status->lockZeichnung();
-		status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
-		status->unlockZeichnung();
-		run = 0;
-		return;
-	}
-	status->lockZeichnung();
-	status->setText( "Suche nach Updates . . ." );
-	status->unlockZeichnung();
-	Text dgPfad;
-	int gruppe = updater->getNextDateiGruppe( &dgPfad ); // Nächste Dateigruppe die geupdatet werden muss
-	while( gruppe )
-	{
-		if( gruppe == -1 )
-		{ // error
-			status->lockZeichnung();
-			status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
-			status->unlockZeichnung();
-			MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
-			run = 0;
-			return;
-		}
-		bool clientGruppe = !dgPfad.getLength();
-		if( !clientGruppe )
-		{ // Das Spiel kann bereits gestartet werden
-			play->addStyle( Knopf::Style::Sichtbar );
-			ret = 2;
-		}
-		status->lockZeichnung();
-		status->setText( "Update für '" );
-		if( !clientGruppe )
-			status->zText()->append( dgPfad.getText() );
-		else
-			status->zText()->append( "Client" );
-		status->zText()->append( "'. . ." );
-		status->unlockZeichnung();
-		UpdateParams params;
-		params.abbruch = close;
-		params.dateiGruppe = gruppe;
-		params.zFortschritt = fortschritt;
-		params.zStatus = 0;
-		int res = updater->update( &params );
-		if( res == 3 )
-		{ // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
-			status->lockZeichnung();
-			status->setText( "Klicke auf Play, um die verbleibenen Änderungen zu übernehmen." );
-			status->unlockZeichnung();
-			play->addStyle( Knopf::Style::Sichtbar );
-			ret = 1;
-			run = 0;
-			return;
-		}
-		if( res == 2 )
-			break;
-		if( res == 1 )
-			MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
-		status->lockZeichnung();
-		status->setText( "Suche nach Updates . . ." );
-		status->unlockZeichnung();
-		gruppe = updater->getNextDateiGruppe( &dgPfad );
-	}
-	status->lockZeichnung();
-	status->setText( "Alle ausgewählten Dateien sind aktuell." );
-	status->unlockZeichnung();
-	play->addStyle( Knopf::Style::Sichtbar );
-	ret = 2;
-	HMODULE sDll = LoadLibrary( "data/bin/GSL.dll" );
-	if( sDll )
-	{
-		GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( sDll, "getGSLDatei" );
-		if( getGSLDatei )
-		{
-			GSL::GSLDateiV *sDatei = getGSLDatei();
-			sDatei->setDatei( "data/sounds/popup.gsl" );
-			sDatei->leseDaten();
-			GSL::GSLSoundV *sound = sDatei->getSound( "info.wav" );
-			sDatei->release();
-			sound->setVolume( 0xFFFF, 0xFFFF );
-			sound->playSound();
-			sound->warteAufSound( 3000 );
-			sound->stopSound();
-			sound->release();
-		}
-		FreeLibrary( sDll );
-	}
-	run = 0;
+    if( !updater )
+    {
+        status->lockZeichnung();
+        status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
+        status->unlockZeichnung();
+        run = 0;
+        return;
+    }
+    status->lockZeichnung();
+    status->setText( "Suche nach Updates . . ." );
+    status->unlockZeichnung();
+    Text dgPfad;
+    int gruppe = updater->getNextDateiGruppe( &dgPfad ); // Nächste Dateigruppe die geupdatet werden muss
+    while( gruppe )
+    {
+        if( gruppe == -1 )
+        { // error
+            status->lockZeichnung();
+            status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
+            status->unlockZeichnung();
+            MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
+            run = 0;
+            return;
+        }
+        bool clientGruppe = !dgPfad.getLength();
+        if( !clientGruppe )
+        { // Das Spiel kann bereits gestartet werden
+            play->addStyle( Knopf::Style::Sichtbar );
+            ret = 2;
+        }
+        status->lockZeichnung();
+        status->setText( "Update für '" );
+        if( !clientGruppe )
+            status->zText()->append( dgPfad.getText() );
+        else
+            status->zText()->append( "Client" );
+        status->zText()->append( "'. . ." );
+        status->unlockZeichnung();
+        UpdateParams params;
+        params.abbruch = close;
+        params.dateiGruppe = gruppe;
+        params.zFortschritt = fortschritt;
+        params.zStatus = 0;
+        int res = updater->update( &params );
+        if( res == 3 )
+        { // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
+            status->lockZeichnung();
+            status->setText( "Klicke auf Play, um die verbleibenen Änderungen zu übernehmen." );
+            status->unlockZeichnung();
+            play->addStyle( Knopf::Style::Sichtbar );
+            ret = 1;
+            run = 0;
+            return;
+        }
+        if( res == 2 )
+            break;
+        if( res == 1 )
+            MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
+        status->lockZeichnung();
+        status->setText( "Suche nach Updates . . ." );
+        status->unlockZeichnung();
+        gruppe = updater->getNextDateiGruppe( &dgPfad );
+    }
+    status->lockZeichnung();
+    status->setText( "Alle ausgewählten Dateien sind aktuell." );
+    status->unlockZeichnung();
+    play->addStyle( Knopf::Style::Sichtbar );
+    ret = 2;
+    HMODULE sDll = LoadLibrary( "data/bin/GSL.dll" );
+    if( sDll )
+    {
+        GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( sDll, "getGSLDatei" );
+        if( getGSLDatei )
+        {
+            GSL::GSLDateiV *sDatei = getGSLDatei();
+            sDatei->setDatei( "data/sounds/popup.gsl" );
+            sDatei->leseDaten();
+            GSL::GSLSoundV *sound = sDatei->getSound( "info.wav" );
+            sDatei->release();
+            sound->setVolume( 0xFFFF, 0xFFFF );
+            sound->playSound();
+            sound->warteAufSound( 3000 );
+            sound->stopSound();
+            sound->release();
+        }
+        FreeLibrary( sDll );
+    }
+    run = 0;
 }
 
 // constant
 bool Patcher::läuftPatch() const
 {
-	return run;
+    return run;
 }
 
 int Patcher::getReturn() const
 {
-	return ret;
+    return ret;
 }
 
 void Patcher::warteAufPatch( int zeit )
 {
-	warteAufThread( zeit );
+    warteAufThread( zeit );
 }
 
 int Patcher::getDownload() const
 {
-	return updater ? updater->getDownload() : 0;
+    return updater ? updater->getDownload() : 0;
+}
+
+// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+Thread *Patcher::release()
+{
+    if( ref == 2 && run )
+    {
+        *close = 1;
+        warteAufPatch( 5000 );
+        if( run )
+            ende();
+    }
+    return Thread::release();
 }

+ 2 - 0
patcher/Patcher.h

@@ -34,6 +34,8 @@ public:
 	int getReturn() const;
 	void warteAufPatch( int zeit );
 	int getDownload() const;
+    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
+    Thread *release() override;
 };
 
 #endif

BIN
patcher/data/start/icon.exe