C++ Timer soll Anzahl erhöhen

KingLM97

Lieutenant
🎅Rätsel-Elite ’18
Registriert
Mai 2012
Beiträge
926
Hallo,

ich habe ein kleines (oder großes?) Problem. Ich versuche einen Timer zu erstellen, der aktiviert wird, wenn ich die Leertaste drücke. Wenn ich die Leertaste gedrückt halte, soll ein Wert pro 3 sec um 1 steigen. Wenn ich nun wieder Loslasse, soll der Wert unter einer Variablen gespeichert werden. Könnt ihr mir da helfen, also wie ich das mache?
 
as hängt jetzt von Betriebssystem ab
bzw. von welcher Library verwendet wird.
 
Windows XP, keine Library, weil ich das für die Schule brauche.
 
Da ein Timer schon eine eigene Klasse ist, ist das eigentlich gar kein großes Problem.

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx#Y0

Jetzt musst du nur noch mit den richtigen Events den Interval des Timers ändern und den restlichen Code hinzufügen (aber da du das für die Schule brauchst, ist es hilfreicher wenn du das selber machst ;) )

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keydown.aspx
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keyup.aspx
 
Also, wenn ich ganz ehrlich bin, das MSDN mag ich nicht, Ich verstehe das garnicht mal (oO). Ich habe jetzt seit ca. 2 Monaten Informatik-AG, und wir haben (fast) noch die Grundlagen. Kann mir das mal jemand genauer erklären?
 
the_nobs schrieb:
as hängt jetzt von Betriebssystem ab
nein, echt nicht.

Die simpelste Methode wäre eine while(true) Schleife, und in dieser nochmal eine Schleife, die den Tastendruck als Bedingung hat. Pseudocode:
Code:
static int counter = 0;
while(true){
  while(keyDown.SPACE)
  tempTime=timer.getTime();
  while(keyDown.SPACE){
    if (timer.getTime()-tempTime>=3000){  // 1000 ms = 1 Sek., da Timer meistens ms returnen
       counter++;
       tempTime=time.getTime();
    }
  }
}

Allerdings denke ich nicht, dass man das nach 2 Monaten Informatik-Crashcurs verstehen kann.
 
Zuletzt bearbeitet:
Bis auf 3 Errors klapt alles. Der zeigt mir nur an, dass keyDown.SPACE falsch ist oder sowas in der Art (bin kacke in Englisch):
c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\anything 2\anything 2\anything 2.cpp(12) : error C2065: 'keyDown' : undeclared identifier

c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\anything 2\anything 2\anything 2.cpp(12) : error C2228: left of '.SPACE' must have class/struct/union

c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\anything 2\anything 2\anything 2.cpp(12) : fatal error C1903: unable to recover from previous error(s); stopping compilation
 
Ja, wie gesagt, das ist nur Pseudocode. Hab grad nicht im Kopf, wie es exakt heißt.

Ich fahr jetzt raus an See und leg mich in die Sonne :D
 
Kennt/weiß jemand was ich dafür #include muss?
 
F_GXdx schrieb:
nein, echt nicht.
doch hängt davon ab, da es verschiedene Funktionen gibt...
z.b. the GetInputKeyPressed gibts unter *nix systeme nicht, da sie ja Win32 spezifisch sind

-> Voila, abhängig von OS

Auserdem:
den wichtigsten Teil, wie man keyDown.SPACE bekommt lässt du mit der Aussage "ist Pseudocode" unbeantwortet..
Windows XP, keine Library, weil ich das für die Schule brauche.
sorry, aber irgendeine Library benutzt du, da ohne so etwas gar nix läuft..
Also nutzt du MFC?
nackte Win32?
oder überhaupt nur die stdlib?
hast du boost oder ähnliches?

poste mal deinen Code wie du dir das mit den Timer vorstellst
bzw. schreib das programm mal so das der Timer funktioniert hardcoded auf 3 sekunden wenn du die SPACE taste drückst...
 
Zuletzt bearbeitet:
Na dann halt das fertige Programm:

Code:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <Winuser.h>
#include <ctime>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	static int counter = 0;
	const int threshold = 3;

	cout << "Welcome to the best program in the world!" << endl;
	cout << "Press 'space' for 3 sec to increase the counter variable!" << endl;
	cout << "Press \<esc\> to end." << endl << endl;

	while(true){

		while(GetKeyState(VK_SPACE)<0){

			time_t tempTime = time(0);

			cout << "Starting to count to 3..." << endl;
			
			while(GetKeyState(VK_SPACE)<0){
				if (time(0)-tempTime>=threshold){
					counter++;
					tempTime=time(0);
					cout << "Variable 'counter' has changed! It is now: " << counter << endl;
				}
			}
			cout << "Stop!" << endl << endl;
		}

		if(GetKeyState(VK_ESCAPE)<0){
			return 0;
		}
	}
	return 0;
}

Das mit der Tastendruckerkennung ist ein bisschen komisch, da habe ich jetzt selbst erst googlen müssen. Halte dich einfach an das hier: http://stackoverflow.com/questions/5302456/how-do-i-get-the-high-and-low-order-bits-of-a-short

Das mit dem Timer ist auch ein bisschen komisch.

Ach, es hat schon seinen Grund, warum man Anfängern erst Java lernt. C++ ist einfach kompliziert.
Ergänzung ()

Schöner als

Code:
while(GetKeyState(VK_SPACE)<0)

wäre allerdings

Code:
while(((unsigned short) GetKeyState(VK_SPACE))>>15==1){

denn das entspricht eher der Doku, in der steht über die Funktion "GetKeyState":
If the high-order bit is 1, the key is down;

Warum dies? Die Rückgabe der Funktion ist vom Typ "short", das heißt, die ist 16 Bit lang. Das Highorderbit ist das "linkeste", das heißt, wir schieben den Rückgabewert 15 Stellen nach rechts.

So wird zB aus:
1000000000000000

nach der >> 15 Operation:

1

und das können wir dann überprüfen.

Leider ist die Doku ungenau, der Typ ist streng genommen "unsigned short" und nicht "short". Lässt man das unsigned nämlich weg, gibt es erwartungsgemäß (wenn man das Hintergrundwissen aus dem Bereich Numerik hat) negative Werte.
 
Zuletzt bearbeitet:
Zurück
Oben