DDD Temat założony przez niniejszego użytkownika |
Prosty czat w konsoli - Funckja Scanf blokuje program » 2015-01-16 22:35:37 Cześć wszystkim! Piszę prosty czat i mam mały problem. Funckja Scanf blokuje program. Nie wiem jak ją ominąć jeżeli nic nie wpisuje ( chce żeby wtedy mi program odbierał wiadomości) while( true ) { scanf( "%s", string ); int iResult =( send( sock, string, 128, 0 ) ) &&( send( sock, mynick, 128, 0 ) ); if( recvTimeOut( sock, string ) > 0 ) { printf( "%s", nick ); printf( "%s/n", string ); } }
Może ktoś ma jakiś pomysł? Pozdrawiam |
|
pekfos |
» 2015-01-16 22:48:03 Wielowątkowość. |
|
DDD Temat założony przez niniejszego użytkownika |
» 2015-01-16 22:58:15 Nie pytałem jak napisać czat. Pytałem jak zrobić żeby ominąć Scanf żeby nie blokował mi pętli. Napisałem takie coś. Ale tu musisz kliknąć "q" żeby móc pisać. Chodzi mi o to żeby ominąć to q while( quit == 0 ) { if( kbhit() ) c = getch(); else c = 'r'; if( c == 'q' ) { int pisanie = 1; while( pisanie == 1 ) { scanf( "%s", string ); if( !( strcmp( string, "q" ) == 0 ) ) { int iResult =( send( sock, string, 128, 0 ) ) &&( send( sock, mynick, 128, 0 ) ); } if( strcmp( string, "q" ) == 0 ) pisanie = 0; } }; if( recvTimeOut( sock, string ) > 0 ) { printf( "%s", nick ); printf( "%s\n", string ); if( strcmp( string, "tak" ) == 0 ) { printf( "wwweee!!;D o tak! " ); } } }
|
|
bnk120 |
» 2015-01-16 23:33:07 To użyj cin. Zresztą nie rozumiem do końca z czym masz problem. |
|
stryku |
» 2015-01-16 23:47:16 Tak jak napisał pefkos. Zrób jeden wątek do wysyłania i jeden do otrzymywania wiadomości. Tak było by chyba elegancko.
Mniej elegancko ale działająco już zrobiłeś. Wg mnie nawet spoko to jest, nawet w grach czasami to się wykorzystuje, że najpierw trzeba wcisnąć jakiś przycisk i wtedy dopiero się coś piszę (CS i wciskanie 'y'). Tylko ja bym zmienił q na enter.
Więc masz dwie opcje: na wątkach - więcej pracy, ale elegancko tak jak masz - mniej pracy, ale brzydko
Jeżeli nie piszesz czegoś w stylu gg i chcesz popisać z kolegą tylko czy coś to wystarczy pewnie ten sposób, który masz teraz |
|
DDD Temat założony przez niniejszego użytkownika |
» 2015-01-17 08:40:42 Dzięki wszystkim za odpowiedź :] @bnk120 cin również zatrzyma pętle dopóki nie wpiszemy czegoś. @stryku właśnie chodzi o to że to jest projekt w którym nie za bardzo pasuje mi użyć wielowątkowości a działanie ma być jak gg w konsoli. I to właśnie nie wiem jak to ominąć w konsoli bo w innym interfejsie nie ma problemu tego ominąć. Jakieś 3-4 lata temu to omijałem a teraz musiałem wrócić do tego i nie mam prostego pomysłu (nie mogę sobie przypomnieć). :P Ale dzięki,
Pozdrawiam |
|
1aam2am1 |
» 2015-01-17 13:11:17 kbhit? |
|
stryku |
» 2015-01-17 13:50:28 Albo tak jak sugeruje 1aam2am1. zrób coś takiego std::string wiadomosc; while( 1 ) { while( kbhit() ) { char klawisz = getch(); if( klawisz == 0 ) klawisz = getch(); if( klawisz == '\r' ) { } else wiadomosc += klawisz; } }
Tylko, że to jest na windowsa tylko. Kbhit na linuxa masz tutaj: http://cboard.cprogramming.com/c-programming/63166-kbhit-linux.html |
|
« 1 » 2 |