C++ loop ohne While

04/17/2014 12:58 Unreal <3#1
Hey.
Hab folgendes Problem;
Versuche mich zurzeit an einem kleinen Konsolenspiel, jedoch hab ich das Problem, dass ich nicht aus dem While Loop rauskommen, jedoch einen infinite loop brauche, for funktionierte ebenfalls nicht.

Code:
int _tmain(int argc, _TCHAR* argv[])
	{
	thread StatsT(Stats);
	StatsT.join();
	
	cout << "test1" << endl;
	cout << "test2" << endl;
	hp +23;
	getchar();
	return 0;
}

void Stats()
	{
	for(;;)
		{
	system("cls");
	cout << "RPG\n\n";
	cout << "Level: " << lvl << endl;
	cout << "Aktuelle HP: " << hp << "/" << mhp << endl;
	cout << "Erfahrung: " << Exp << "/" << mexp << endl;
	cout << "Gold: " << cash << "$" << endl;
	cash++;
		}
	}
Das Problem ist halt, dass es aus dem Thread nicht mehr raus kommt, jedoch er weiter laufen muss, die Frage ist nun: Wie?

Mfg
04/17/2014 13:18 Padmak#2
Lass StatsT.join() weg, und bau in die Forschleife BITTE nen 1-ms-Sleep ein, plus gib dein Menü am besten erst dann neu aus, wenn sich einer der Werte verändert hat
Und schmeiß using namespace std; raus

Padmak
04/17/2014 13:18 Actidnoide#3
Fuer das Verlassen einer Loop gibt es 'break;'.

Quote:
Originally Posted by Unreal <3 View Post
Hey.
Das Problem ist halt, dass es aus dem Thread nicht mehr raus kommt, jedoch er weiter laufen muss, die Frage ist nun: Wie?

Mfg
Wenn der Thread beendet wird, laeuft das Programm in deinem Fall auch nicht weiter. Was genau moechtest du erreichen?

//edit: und da hilft man mal eine sekunde zu spaet :)
04/17/2014 13:26 Unreal <3#4
Quote:
Originally Posted by Actidnoide View Post
Fuer das Verlassen einer Loop gibt es 'break;'.



Wenn der Thread beendet wird, laeuft das Programm in deinem Fall auch nicht weiter. Was genau moechtest du erreichen?

//edit: und da hilft man mal eine sekunde zu spaet :)
Will erreichen dass sich der Loop dauerhaft wiederholt, jedoch das Zeug da drüber weiterläuft, also;

Code:
int _tmain(int argc, _TCHAR* argv[])
	{
	thread StatsT(Stats);
	StatsT.join();
	
	cout << "test1" << endl;
	cout << "test2" << endl;
	hp +23;
	getchar();
	return 0;
}
Edit: Es war schon ein Sleep drinne, ist momentan aber draußen.
04/17/2014 13:32 Actidnoide#5
Dann solltest du .join() nicht aufrufen. Damit wartest du naemlich auf die Beendigung des Threads

ausserdem
Code:
hp +23; // soll wohl eher 'hp += 23;' sein?
04/17/2014 13:42 Unreal <3#6
Quote:
Originally Posted by Actidnoide View Post
Dann solltest du .join() nicht aufrufen. Damit wartest du naemlich auf die Beendigung des Threads

ausserdem
Code:
hp +23; // soll wohl eher 'hp += 23;' sein?
Was soll ich stadessen tun? Ich muss doch ebenfalls irgendwie den Thread laufen lassen, right?
04/17/2014 13:46 Actidnoide#7
[Only registered and activated users can see links. Click Here To Register...] :rtfm:

Beim Aufruf des Konstruktors von std::thread wird der Thread bereits gespawned. Kein weiterer Aufruf noetig
04/17/2014 13:55 lo3o#8
ich has problem du...???
04/17/2014 14:49 Nightblizard#9
Der Code compiliert nichteinmal. Wie sollen wir dir helfen, wenn du nicht funktionierenden Code postest?
04/17/2014 17:44 MrSm!th#10
Quote:
Originally Posted by Padmak View Post
Lass StatsT.join() weg, und bau in die Forschleife BITTE nen 1-ms-Sleep ein, plus gib dein Menü am besten erst dann neu aus, wenn sich einer der Werte verändert hat
Und schmeiß using namespace std; raus

Padmak
Sleep(0) reicht.
04/18/2014 03:06 Delinquenz#11
Quote:
Sleep(0) reicht.
Oder plattformunabhängig: std::this_thread::sleep_for().
04/18/2014 15:09 MrSm!th#12
Quote:
Originally Posted by Delinquenz View Post
Oder plattformunabhängig: std::this_thread::sleep_for().
Das war Pseudocode ;O Sleep(0) wäre unter Windows nicht gültig (ein Argument zu wenig), falls du dich auf die WinApi Funktion bezogen hast.

Dennoch Entschuldigung für die irreführende Schreibweise.
04/18/2014 15:40 Tyrar#13
Quote:
Originally Posted by MrSm!th View Post
Das war Pseudocode ;O Sleep(0) wäre unter Windows nicht gültig (ein Argument zu wenig), falls du dich auf die WinApi Funktion bezogen hast.

Dennoch Entschuldigung für die irreführende Schreibweise.
MSDN sagt
Code:
VOID WINAPI Sleep(
  _In_  DWORD dwMilliseconds
);
[Only registered and activated users can see links. Click Here To Register...]
04/18/2014 16:09 MrSm!th#14
Muss am Schlafmangel liegen.. :o

Dennoch war es nicht auf die Windows Funktion bezogen :D


Irgendwie muss ich an SleepEx gedacht haben..
04/18/2014 21:39 snow#15
Statt Sleep(0); könnte man eigentlich auch SwitchToThread() bzw. std::this_thread::yield() verwenden. Hat Sleep(0); irgendwelche Vorteile? :o