2011-11-15 3 views
0

NSThreadとして実行されているマルチキャスト受信デーモンがあります。受信を待っている間、私は来ないかもしれない別のパケットを待つことなくそれをキャンセルできるようにしたいと思います。待っているだけなので、isCancelledをチェックするために他のコードを実行することはできません。これどうやってするの?スレッドがパケットの受信を待っているときにNSThreadをキャンセルするには?

ここでパケットが入るまで、それが座っていると、最初の行に待って...受信しているコードだも代理人である親、で

/* block waiting to receive a packet */ 
      if ((recv_len = recvfrom(sock, recv_str, MAX_LEN, 0, 
            (struct sockaddr*)&from_addr, &from_len)) < 0) { 
       [delegate multicastDaemonDidFinish:self withError:@"recvfrom() failed"]; 

       exit(1); 
      } 
      receivedString = [NSString stringWithFormat:@"%s", recv_str]; 
      [delegate multicastDaemonDidReceiveData:self receivedString:receivedString]; 

、このスレッドがで呼び出されます。

私は[daemonThread cancel]を発行できますが、daemonThreadは待機中にisCancelledをチェックしません。これどうやってするの?

答えて

1

タイムアウトを使用して選択呼び出しをループすることができます。 selectが0を返した場合は、タイムアウトになり、キャンセルフラグをチェックしてスレッドを終了するか、再度選択を実行することができます。受け取るべきものがあれば、それを受信機で処理し、ループから抜け出す。

+0

selectは私の問題を解決します。私はまだ仕事をキャンセルしていませんが、私は選択して仕事をしており、まもなく取り消すことができます。ありがとう! – Adam

2

要するに、あなたはしません。あなたはそれがクローズド/死んだ/除外されていることを示す信号をソケットに送る必要があります。

あなたはUNIXレベルのドキュメントをよく読んでください。私はソケットを閉じることができるはずだと思いますが、スレッドの依存関係はわかりません。

もう1つの解決策は、タイムアウトを持つAPIを使用することです。 N秒間待って、キャンセルされたことを確認し、N秒以上待ちます。

は、ソケットAPIを全く使用しません。です。 dispatch_sourceおよび/またはCFStreamsや他のより高いレベルの抽象化を使用します。明らかに、移植性を目指すなら、それを行うことはできません(しかし、ObjCのインタリーブは、移植性が考慮されていないことを示しています)。

関連する問題