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을 리턴하면, 시간 초과되어 취소 플래그를 점검하고 스레드를 종료하거나 다시 선택을 수행 할 수 있습니다. 수신 할 항목이 있으면 recevfrom을 사용하여 처리하고 루프에서 빠져 나오십시오.

+0

select 내 문제가 해결됩니다. 아직 취소 작업을하지는 못했지만 선택 작업이 필요하며 곧 취소 할 수 있습니다. 감사! – Adam

2

간단히 말해서, 그렇지 않습니다. 소켓에 그것이 닫혀 있는지/죽었는지/예외가되었는지를 나타내는 신호를 보내야합니다.

유닉스 수준의 문서를 자세히 읽어야합니다. 소켓을 close() 할 수 있어야한다고 생각 하겠지만 스레드 종속성을 알지 못합니다.

다른 해결책은 시간 초과가있는 API를 사용하는 것입니다. N 초 동안 기다리거나, 취소 된 것을 확인하고, N 초 이상 기다리십시오.

은 소켓 API를 전혀 사용하지 않습니다.입니다. dispatch_source 및/또는 CFStreams 및/또는 다른 상위 수준 추상화를 사용하십시오. 분명히, 당신은 이식성을 위해 간다면 그렇게 할 수 없다. (그러나 ObjC 코드의 인터리빙은 이식성이 고려되지 않음을 나타낸다.)