2

現在のスレッドを停止するためにdispatch_semaphore_waitを使用していますが、すべてのスレッドを停止しているようです。

コード:

SampleReader *reader = [[SampleReader alloc] initWithHostname:hostname andFilePath:filepath];
reader.endHandler = endHandler;

[reader start];

dispatch_semaphore_wait(reader->mSem, DISPATCH_TIME_FOREVER);

私の開始方法には次のようなものがあります:

mFileStream = [[NSOutputStream outputStreamToFileAtPath:[fileurl path] append:FALSE] retain];
[mFileStream open];

mNetworkStream = (NSInputStream *)CFReadStreamCreateWithFTPURL(NULL, (CFURLRef)ftpurl);
mNetworkStream.delegate = self;
[mNetworkStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[mNetworkStream open];

セマフォにシグナルを送るデリゲートメソッドの1つでコールバックを取得します

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{

  switch (eventCode)
  Case NSStreamEventErrorOccurred:
                    dispatch_semaphore_signal(mSem);
        break;
    case NSStreamEventEndEncountered:
        dispatch_semaphore_signal(mSem);
        break;

}

ただし、セマフォで待機を送信すると、デリゲート メソッドが呼び出されません。行をコメントアウトしたときにのみ呼び出されます

 //dispatch_semaphore_signal(mSem);

どんな助けでも大歓迎です。

4

1 に答える 1

4

メイン スレッドから呼び出している場合[reader start]は、デッドロックが発生しています。あなたのストリームはここでメインスレッドに関連付けられています:

[mNetworkStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

つまり、メインの実行ループが回転している必要があります。ただし、がメインスレッドにある場合dispatch_semaphore_waitは、実行ループを停止し、ストリームがそのイベントを処理できないようにしています。

をコメントアウトすると、返さdispatch_semaphore_signalれない以外に何ができるかわかりませんwait

于 2011-10-31T13:19:55.217 に答える