Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prosty czat w konsoli - Funckja Scanf blokuje program

Ostatnio zmodyfikowano 2015-01-17 16:50
Autor Wiadomość
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)
C/C++
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
P-125068
pekfos
» 2015-01-16 22:48:03
Wielowątkowość.
P-125071
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

C/C++
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! " );
        }
    }
}
 
P-125072
bnk120
» 2015-01-16 23:33:07
To użyj cin. Zresztą nie rozumiem do końca z czym masz problem.
P-125073
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
P-125074
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
P-125077
1aam2am1
» 2015-01-17 13:11:17
kbhit?
P-125088
stryku
» 2015-01-17 13:50:28
Albo tak jak sugeruje 1aam2am1.

zrób coś takiego
C/C++
std::string wiadomosc;
while( 1 )
{
    while( kbhit() )
    {
        char klawisz = getch();
        if( klawisz == 0 )
             klawisz = getch();
       
        if( klawisz == '\r' ) //enter
        {
            //wysylanie
        }
        else
             wiadomosc += klawisz; // musisz zrobi tez obsluge klawiszów specjalnych takich jak f1 itp, żeby ich nie dodawać do wiadomości
       
    }
   
    //odbieranie
}

Tylko, że to jest na windowsa tylko. Kbhit na linuxa masz tutaj: http://cboard.cprogramming.com​/c-programming​/63166-kbhit-linux.html
P-125091
« 1 » 2
  Strona 1 z 2 Następna strona