2012-02-20 5 views
0

私はインターフェイスとしてncursesを使用するこのチャットプログラムを書いています。どのようにして、ソケットファイル記述子とユーザー介入を同時に処理すると思いますか?私の考えは以下の通りです。問題はループが私が押す各ボタンに対して一度だけ実行するようになったことです。準備ができたらすぐにソケットとユーザーのやりとりが処理されるようにプログラムを構成するにはどうすればよいですか?私は私のアンケートに標準的な入力と出力のためのファイル記述子を含めるようにしましたが、それはうまくいきません。ユーザインタラクションとソケットイベントを同時に処理するにはどうすればよいですか?

while(ch = getch()) { 
    poll sockets 
    loop sockets { 
     ... 
    } 
    switch(ch) { 
     ... 
    } 
} 

さらに一般的な質問です。どのようにして、一般的に、ユーザーのやりとりや他のことを同時に処理するプログラムを作成するのですか?これを行う標準的な方法があるようです。

答えて

1

入力画面でnodelay()を試すことができます。

nodelay(stdscr,TRUE); // turn off getch() blocking 

while(getch() == ERR) 
{ 
    //do other stuff 
} 
else 
    //handle input 

しかし、チャンスはあなたがラインを下にスレッドに行きたいことがあります。

0

STDINと読み込みしようとしているソケットを含むファイルディスクリプタセット(FD_SET)を作成し、そのセットでselect()を使用します。次のようなもの::

int main(int argc, char **argv) 
{ 
    fd_set fds; 
    int fd = open(/* your socket */); 
    struct timeval tv; 

    FD_ZERO(&fds); 
    FD_SET(STDIN_FILENO, &fds); 
    FD_SET(fd, &fds); 

    while (1) { 
    tv.tv_sec = 1; // wait for up to 1 sec 
    int retval = select(2, &fds, NULL, NULL, &tv); 
    if (retval > 0) { 
     if (FD_ISSET(STDIN_FILENO, &fds)) 
      // process stdin 
     else if (FD_ISSET(fd, &fds)) 
      // process data from your socket 
    } else if (retval == 0) 
     // timeout 
    else 
     // some error 
    } 
    exit 0; 
} 

(私はこれをコンパイルしませんでしたが、あなたのアイデアを取得する必要があります。)

fd_setselect tutorial

を参照してください。
関連する問題