Problem mit kbhit



  • ich hab da ein problem mit kbhit, dass ich mir nicht erklären kann.

    Ich programmier gerade einen simplen peer-to-peer chat, wobei ein Benutzer auch gleichzeitig "Server" ist. Die Tastatureingabe will ich mit kbhit() lösen.

    (kurze Anmerkung: ich benutze sowohl beim Client als auch beim Server die selbe Eingaberoutine, zumindest will ich das.)

    Situation 1:

    do
    {
    ...
    
    if(kbhit())
        ch = getche();
    
    ...
    }while(...);
    

    soweit, so schlecht. Ich kann, wenn ich kbhit() so verwende gerademal ein Zeichen eingeben, dann geht nix mehr und das Programm stürzt nach einiger Zeit ab.

    Situation 2:

    do
    {
    ...
    
    while(!kbhit());
    ch = getche();
    
    ...
    }while(...);
    

    So funktioniert es. Allerdings muss ich dann beim Server bzw. Client (je nachdem, wer die Nachricht erhält) noch eine Taste drücken, damit die gesendete Nachricht dann auch angezeigt wird. Es scheint also so zu sein, wenn ich kbhit() wie hier gezeigt benutze, dass es die Hauptschleife pausiert (vermutlich bei while(!kbhit()); ).

    Situation 3:
    Server und Client bekommen unterschiedliche Eingaberoutinen, heißt, der Client z.B. bekommt if(kbhit()), der Server while(!kbhit());. Der Benutzer mit if(kbhit()) hat das Problem von Situation 1, er kann maximal 1 Zeichen eingeben. Allerdings wird, wenn er vom anderen Benutzer (der mit while(!kbhit()); ) eine Nachricht bekommt, diese auch ohne Probleme sofort angezeigt.

    Frage also: Wisst ihr wo das Problem liegen könnte, und wie ich es vielleicht löse?

    Danke schonmal im Voraus.

    Veccolo



  • #include <conio.h>
    #include <stdio.h>
    
    int main (void){
    	char	szTest ;
    	do{
    		if (kbhit()){
    			szTest = getch() ;
    			if (szTest == 27) // ESC
    				return 0 ;
    			else
    				printf ("%c", szTest) ;
    		}
    	}while(1) ;
    	return 0 ;
    }
    

    deine "Situation 1" musste funzen... (by mir funzt es so: s.o.), der fehler muss wo anders liegen.



  • Jup if(kbhit()) e = getch; funktioniert. Es wartet nicht.

    MfG SideWinder



  • Ah jetzt geht es, danke!

    vorher hab ich es so gemacht:

    ...
    if(kbhit())
        ch = getche();
    
    if(ch != 0 && ch != 13 && ...)
    {
        ...
    }
    else if(ch == 13)
    {
        ...
    }
    

    das ging nicht, da hab ich das obere Problem gehabt

    Jetzt hab ich die Stellen, die auf die Eingabe reagieren innerhalb der if(kbhit())-Anweisung gemacht (so wie toom). Jetzt geht es. Danke Euch beiden!


Log in to reply