Keypressed() nervöser SChüler bittet um schnellen rat



  • Gut, dann bin ich wohl durcheinander gekommen, oder hab mich vergoogelt.

    Gibt es etwas equivalentes zu keypressed()? ich will eig nur prüfen, ob irgendeine Taste gerdück ist, wenn dein, dann soll der Codefluss einfach weiterfliesen. 🙂



  • Eigentlich solltest du deine IDE oder zumindest OS mal verraten... was auch immer allegro ist, von dem xatrixx spricht - vll gibts ja dort diese fkt...



  • hänge gerade bei windows Xp. Und IDE verwende ich nicht.

    hab mit socketprogrammierung angefangen und einen kleinen Messenger programmiert.

    nun zum problem: es sollen laufend nachrichten empfangen werden und, wenn eine da ist, sei per cout in die konsole gehämmet werden.

    sobald der user eine taste drückt, soll angefangen werden, die zeichenkette in einen buffer zu schmeisen und wenn der user fertig ist, soll diese nachricht gesendet werden.



  • vtl, etwas dumm geschrieben.

    WEnn der User eine Taste drückt, dann sollen alle weiteren tastenschläge (meinetwegen auch die eben gedrückte taste) aufgezeichnet werden( per cin) und dann gesendet werden. Bin jetzt so weit:

    ... Socket funzt...
    
    rc = send(s,"I am the Client.",17,0);
    
      while(true){
    
    	cout<<"Clear the buffer"<<endl;
    	for(int i = 0; i < 256; i++)
    		buf[i] = 0;
    	rc = 0;
    
    	cout<<"waiting for a message"<<endl;
    	while(!keypressed()){
    		rc = recv(s,buf, 256, 0);
    		if(rc != 0){
    			cout<<"Found a message in the postbox"<<endl;
    			cout<<buf<<endl;
    			break;
    			}
    		}
    
    	cout<<"Write the Text, please:"<<endl;
    	cin>>buf;
    	rc = send(s,buf,256,0);
    	}
    

    ist eventuell etwas umständlich geschrieben, hab aber im mom etwas zeitdruck.



  • Allegro ist eine plattformunabhängige Spieleprogrammierbibliothek. Da hab ich keine Probleme mit keypressed() abfragen.

    wie:

    while(keypressed())
    {
       if(key[KEY_UP])
       {......}
       if(key[KEY_LEFT)
       {......}
    }
    


  • @5000_Watt: Hmm einfach in einem Thread das empfangen packen ... und in nem anderen dann das einlesen der Benutzereingaben (einfach std::getline, std::cin, std::string combi reicht da vollkommen!). Dafür solltest du dir dann mal boost.org angucken!



  • also mal ehrlich... meinst du nicht da wäre select () besser ??
    bevor mal was mit threads macht ...

    Gruß Chris



  • hmm zumindest brauchst man keine threads ... hast recht ^^ nicht nachgedacht!



  • select kann unter Windows nur Sockets handhaben. Unter Linux würde es aber gehen.



  • Darum geht es doch ?! Um sockets... er will das recv nicht blockiert .. (wenn ichs jetzt richtig verstanden habe...) und dann gibt es 2 gute Möglichkeiten..
    a) nonblocking sockets
    b) select()

    Was meinst du jetzt mit genau ?



  • Gut gut, danke erstmal für die vielen Posts.:-)

    Fang aber gerade erstmal mit sockets an.

    Und, mein Messenger funktioniert bestens, die chat funktion könnt ihr euch gerne ansehen.

    void chat(SOCKET s)
    {
    	cout<<endl;
    	cout<<"Schreibe bitte den Text, druecke \".\" um ihn zu senden."<<endl;
    	char buf[256];
    	char c;
    	long rc;
    
      while(true){
    	for(int i = 0; i < 256; i++)
    		buf[i] = 0;
    	rc = 0;
    
    	while(true){
    		rc = send(s," ",1,0);
            	rc = recv(s,buf, 256, 0);
    
    		if(rc > 2){
    			transform(buf);
    			cout<<buf<<endl;
    			for(int i = 0; i < 256; i++)
    				buf[i] = 0;
    			}
    		if(kbhit())
    			break;
    		}
    
    	cout<<"<<";
    	for(int i = 0, c = 0; i < 256 && c != '.'; i++){
    		c = getch();
    		buf[i] = c;
    		cout<<char(c);
    		if(c == '.')
    			cout<<endl;
    		}
    
    	if(buf[0] != '.'){
    		transform(buf);
    		rc = send(s,buf,256,0);
    		}
    	}
    }
    

    Bin eigendlich ziemlich zufrieden mit meiner Arbeit. Werde natürlich fleisig weiterlernen um das ganze so weit wie möglich zu verbessern. (Ich weiss, das ich es wahrscheinlich sehr umständlich gemacht habe) Wollte aber einfach nur erreichen, das es sich beim laden einer Message nich aufhängt, nur weil keine drinne ist. Deswegen sende ich immer 1 Zeichen und wenn jemand eine Tase drückt, kann er mehr/sinnvollerer Zeug senden.

    🙂

    Bis dahin Tschüss! und Danke!



  • Achja, ich vergaß:

    void transform(char *str)
    

    erstetzt bei einer zeichenkette alle Leerzeichem mit Unterstriche und umgekehrt. Dadurch kann ich im späteren Verlauf besser damit arbeiten, weil dann mehrere Wörte als eines gesendet werden.

    Sry für den Doppelpost. 😃


Anmelden zum Antworten