0

ncursesをインターフェースとして使用するこのチャットプログラムを書いています。ソケットファイル記述子とユーザーの相互作用を同時に処理するにはどうすればよいですか?私の考えは以下の通りです。問題は、ボタンを押すたびにループが1回だけ実行されることです。ソケットとユーザーの操作が準備ができたらすぐに処理されるようにプログラムを構成するにはどうすればよいですか?ポーリングに標準の入力と出力のファイル記述子を含めてみましたが、機能しません。

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

また、より一般的な質問として。通常、ユーザーの操作やその他の処理を一度に処理するプログラムをどのように作成しますか?これを行うための標準的な方法があるようです。

4

2 に答える 2

1

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

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

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

しかし、チャンスはあなたがラインを下にスレッド化することに行きたいかもしれないということです。

于 2012-02-20T18:27:25.270 に答える
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_setを参照し、チュートリアルを選択してください

于 2012-02-20T23:07:41.083 に答える