JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=b95b09b9851dc41aa412c230ef637817Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Verlassen eines Threads und zu einem anderen wechseln

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
KI
JLI Master


Alter: 40
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 09.08.2004, 00:21    Titel: Verlassen eines Threads und zu einem anderen wechseln Antworten mit Zitat

Ich möchte bei einer bestimmten Bedingung zu einem anderen Thread wechseln. Welche Methode könnt ihr mir empfehlen?

Ich hab 2 Threads.
Einen Haupthread und einen LoadingThread.
(Im LoadingThread werden zur Laufzeit Ressourcen geladen und freigegeben)
Der LoadingThread hat eine niedriege Priorität, damit der Hauptthread so wenig wie möglich beeinträchtigt wird.

Jetzt passiert es allerdings manchmal, dass die Musik, die im Haupthread läuft, kurz hüpft, obwohl der LoadingThread garnichts macht
Der LoadingThread macht in dem Moment also garnichts. Er läuft nur durch eine sinnlose Schleife...

Das stocken der Musik tritt nicht auf, wenn ich SuspendThread auf den LoadingThread anwende!

Soll ich den THread solange "suspenden", bis ich ihn wieder brauche?
Am liebsten wäre mir ein Möglichkeit, bei der der LoadingTHread merkt, dass er nichts zu tun hat und dem System meldet: "Hey ich bin fertig. Mach bitte mit dem Hauptthread weiter!"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 09.08.2004, 00:27    Titel: Antworten mit Zitat

Du kannst doch dem Thread Parameter übergeben:

Code:

void MyThread(Parameter *para)
{
  ...
  //Thread ist abgeschlossen
  para->bDone=true;
}

_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 40
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 09.08.2004, 00:37    Titel: Antworten mit Zitat

Der Thread soll sich nicht beenden.
Er soll weiter existieren... Ich möchte nur, dass er Windows mitteilt:
"Hallo, ich habe keine Aufgaben. Geh weg - zum Hauptthread!"

Soweit ich weiß regelt Windows wie lange ein Thread "arbeitet".
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 40
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 09.08.2004, 00:45    Titel: Antworten mit Zitat

FallenAngel84 hat Folgendes geschrieben:
Du kannst doch dem Thread Parameter übergeben:

Code:

void MyThread(Parameter *para)
{
  ...
  //Thread ist abgeschlossen
  para->bDone=true;
}

Gut. In diesem Fall weiß jetzt auch der Haupthread, dass der andere THread nichts zu tun hat. Doch dies merkt er erst. wenn er wieder an der Reihe ist.

Ich verstehe deinen Lösungsansatz nicht. Confused
So wie es aussieht wird der Thread nach para->bDone=true; geschlossen....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 09.08.2004, 00:48    Titel: Antworten mit Zitat

-.-

Code:

void MyThread(Parameter *para)
{
  while(1)
  {
    if((para->work=Parameter->JobList.size()>0)!=false)
    {
      ... //do stuff here
    }
    else
      SuspendThread(para->threadhandle);
  }
}

_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."


Zuletzt bearbeitet von Fallen am 09.08.2004, 00:49, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 40
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 09.08.2004, 12:44    Titel: Antworten mit Zitat

@Fallen
Wir haben ja gestern schon im IRC adrüber geredet.
Ich habe jetzt eine adäquate Lösung gefunden. Very Happy

Denn der Thread soll sich nicht beenden. (Wie in deinem Codebeispiel)
Er soll weiter existieren und nach einer bestimmten Zeit bzw. einer bestimten Aufgabe, die er erledigt hat, sofort zum Hauptthread wechseln.
Das tut der LoadingThread aus meinem Beispiel nicht automastich.
Er läuft wie gesagt solange nichtstuend in der Schleife bis Windows entscheidet, dass es an der Zeit wäre den Haupthread dran zu nehmen...

Genau das war mein Problem... Denn dadurch gab es im Haupthread Hüpfer in der Musik und anderes...

Lösung: Am Ende der Schleife im Loadingthread habe ich Sleep(0) benutzt. Jetzt wird nach jedem Schleifendurchlauf geguckt ob andere Threads was zu tun haben. Wenn ja dürfen diese Threads ihre wichigen Aufgaben durchführen. Wink

edit:
Code:

// Ladefaden, viel Spaß beim Nähen
DWORD WINAPI LoadingThreadProc(LPVOID)
{
   while(LT_RUNNING(g_ltData.lState))
   {
      if(g_ltData.lState == LT_BUSY)
      {
         //Ressource laden
      }
      Sleep(0); // Andere Threads wichtige Aufgaben erfüllen lassen
   }

   return 0;
}


edit2:
Ja genau so. Smile
Ich hab im selben MOment auch ein Stück Code gepostet. Wink


Zuletzt bearbeitet von KI am 09.08.2004, 12:54, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 09.08.2004, 12:48    Titel: Antworten mit Zitat

Also so:

void MyThread(Parameter *para)
{
while(1)
{
if((para->work=Parameter->JobList.size()>0)!=false)
{
... //do stuff here
}
else
Sleep(0)
}
}
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum