| 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
|
Verfasst am: 09.08.2004, 00:21 Titel: Verlassen eines Threads und zu einem anderen wechseln |
|
|
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 |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.08.2004, 00:27 Titel: |
|
|
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 |
|
 |
KI JLI Master

Alter: 40 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 09.08.2004, 00:37 Titel: |
|
|
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 |
|
 |
KI JLI Master

Alter: 40 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 09.08.2004, 00:45 Titel: |
|
|
| 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.
So wie es aussieht wird der Thread nach para->bDone=true; geschlossen.... |
|
| Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.08.2004, 00:48 Titel: |
|
|
-.-
| 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 |
|
 |
KI JLI Master

Alter: 40 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 09.08.2004, 12:44 Titel: |
|
|
@Fallen
Wir haben ja gestern schon im IRC adrüber geredet.
Ich habe jetzt eine adäquate Lösung gefunden.
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.
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.
Ich hab im selben MOment auch ein Stück Code gepostet. 
Zuletzt bearbeitet von KI am 09.08.2004, 12:54, insgesamt 3-mal bearbeitet |
|
| Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.08.2004, 12:48 Titel: |
|
|
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 |
|
 |
|