You are not logged in.

  • Login

july

Unregistered

1

Friday, September 2nd 2011, 11:16am

Tastaturevent abfragen

Hallo zusammen,
ich hab folgendes Problem, ich hab ein Thread, der mir in einer while(1) schleife konsolen ausgaben macht, natürlich damit es nicht die ganze Zeit flackert, soll die Ausgabe nur bei bestimmten events kommen, darum benutze ich

C/C++ Quellcode

1
changeEvent = WaitForMultipleObjects(2, events, FALSE, INFINITE);

Events ist ein HANDLE-Array, das aus 2 Handles besteht, eins davon ist ein event der von dem anderem Thread geschickt wird, fall es neue Meldungen gab, die dargestellt werden müssen, und das ander soll ein Tastatur-event sein, ob eine Eingabe in der Konsole von dem Benutzer stattgefunden ist und wenn ja, welche. Und da hapert's bei mir Da ich unter Windows programmiere, weiß ich nicht, woher ich ein Handle bekomme, das mir dieses Event signalisiert. Es wurde mir GetStdHandle(STD_INPUT_HANDLE); empfohlen, aber da komm ich auch iwie nicht weiter. Habt ihr vielleich ein Idee wie ich mein Problem lösen kann?

Grüße July

2

Friday, September 2nd 2011, 1:57pm

Wo genau hapert es denn mit GetStdHandle?

MfG
Check

july

Unregistered

3

Friday, September 2nd 2011, 2:30pm

also es wird bei WaitForMultipleObjects nicht blockiert. Vielleicht benutze ich's falsch, kA. ich mach in Main-Methode eine Zuweisung dem Handle

C/C++ Quellcode

1
stdinHandle = GetStdHandle(STD_INPUT_HANDLE);

und später im Thread erwarte ich, dass es wie bei den anderen Events ist, das es durchlässt nur wenn wenn eine Eingabe in der Konsole getätigt wurde.

july

Unregistered

4

Friday, September 2nd 2011, 2:38pm

was ich noch vergessen hab zu erwähnen, stdinHandle wird danach dem Array events zugewiesen.

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
HANDLE mutex, anzevent;
static HANDLE stdinHandle;
HANDLE events[2];
int main()
{
...
  anzevent = CreateEvent(NULL,TRUE,FALSE,TEXT("Neue Meldung eingetrofen"));
  stdinHandle = GetStdHandle(STD_INPUT_HANDLE); //handle für die Eingabe
  events[0] = anzevent;
  events[1] = stdinHandle;
......
}
DWORD WINAPI update(LPVOID attr)
{....
 DWORD changeEvent;
 while(1)
 {
   ...
 
   if (meldungscounter > 0)
    	{
      	ausgabe();
 
      	changeEvent = WaitForMultipleObjects(2, events, FALSE, INFINITE);
     	switch (changeEvent)
        	{
      	case WAIT_OBJECT_0 + 0: //es ist eine neue Meldung eingetroffen
        	{
          	break;
        	}
      	case WAIT_OBJECT_0 + 1: //es gab eine Konsoleneingabe
        	{
              cin >> eingabe;
          	Sleep(1000);
          	if (eingabe > 0 && eingabe <= 7)
            	{
              	choice = eingabe;
            	}
          	break;
        	}
        	}
 	}
else
.....
 }
}


so sieht ungefähr der Aufbau aus.

Grüße July

5

Friday, September 2nd 2011, 4:07pm

Schau mal hier der dritte Post, von Duoas.

Du musst also noch mitells SetConsoleMode den "Consolen Modus" auf 0 setzten.
Jedoch wird ein Event wohl bei jedem Tasten anschlag signaliesert und du das aktuelle Zeichen selbert mit ReadConsole auslesen musst.
Könnte also Probleme geben mit cin.

Mfg Rushh0ur

Similar threads

Social bookmarks