2017-01-10 9 views
1

割り込みが発生し、入力を待つ必要があるという問題があります。どのようにこれを行うにはどのようなアイデア?あなたが最初の呼び出しselectに受信機を変更する必要がC++割り込みスレッドがユーザー入力を待っています

man page of recvfromで示唆したように

bool run; 
void partReceive() { 
    while(run) { 
     ... 
     int rect_len = (int) recvfrom(servSockFD, buffer, 
       MAX_MESSAGE_LEN, 0, (struct sockaddr*) &newAddr, &slen); 
     ... 
    } 
} 

void partCount() { 
    int i = 0; 
    while(run) { 
     i++; 
     if (i >= 5) { 
      run = false; 
     } 
    } 
} 

int main() { 
     run = true; 
     thread receive(partReceive); 
     thread count(partCount); 
     count.join(); 
     receive.join(); 
     return 0; 
} 

それがソケットからの入力を受け取るまでpartReceive()が開催されますので、これは、動作しません。..

+0

何をするには? – Gnqz

+0

私は 'partCount'について心配しています。なぜなら、実際に部品を受信するための接続がないからです。 – infixed

+0

' recvfrom() 'を使用すると、UDPソケットが使用されていることを意味します。もしそうなら、単に 'run'をfalseにセットし、空のデータグラムをlistenソケットポートに' sendto() 'し、' partReceive() 'がそれを普通に受け取れるようにします。 –

答えて

0

man pageを参照)、何かがあるかどうかを確認します。読むべきことがあれば、それは今ブロックされないと知ってrecvfromすることができます。 selectは、何も読み取られなければタイムアウトすることができます。その場合は、少なくとも、受信スレッドを終了するかどうかを確認することができます。

+0

ありがとう –

2

有用なデザインパターンは、メインスレッドが一方の端を所有し、 'select thread'が他方の端を所有しているパイプ(またはより正確にはsocketpair())を使用することです。次に、「スレッドの選択」を停止するには、パイプ上に1文字を送信します(ディスクリプタが選択に追加されているものとします)。これは、終了する必要のあるスレッドを起動させます(スレッドは、ソケットまたはコントロールパイプ上で何かが起きるまで、選択状態でスリープします)。

関連する問題