0

申し訳ありませんが、少し冗長ですが、明確にしたかったのです! ;-)

RTSP のストリーミングに FFMPEG を使用する iOS アプリがあります。私は NSOperationQueue を使用して FFMPEG をマルチスレッド化し、画面に画像を描画する以外のほとんどの作業がバックグラウンド スレッドで行われるようにしました。よく働く!... NSOperationQueue が作成するスレッドが死ぬことはないという事実を除いて!

クラスの init メソッドで Queue を次のように初期化します。

self->opQ = [[NSOperationQueue alloc] init];
[self->opQ setMaxConcurrentOperationCount:1];

ブロックを使用してキューにメソッドを追加します。

[self->opQ addOperationWithBlock:^{
        [self haveConnectedSuccessfullyOperation];
}];

または

[self->opQ addOperationWithBlock:^{
        if (SOME_CONDITION) {
            [self performSelectorOnMainThread:@selector(DO_SOME_CRAP) withObject:nil waitUntilDone:NO];
        }
    }];

後で、RTSP ストリームを破棄する必要がある場合は、FFMPEG にシャットダウンするように指示するだけでなく、次のように呼び出します。

[self->opQ cancelAllOperations];

これは確かにスレッドが作業を行うのを止めますが、実際にそれらを破壊することはありません。以下に、まったく何もしていないスレッドのスクリーン ショットを示します。これは、FFMPEG を数回開始/停止した後、私のスレッドがどのように見えるかです。

悪いスレッド

特に言及されていない限り、NSOperations とそれらが実行されているスレッドは、実行が完了すると破棄されるという Apple のドキュメントを読んだことを覚えているようです。そうではないようです。

NSOperationQueue を破棄し、FFMPEG を再度起動する必要があるときに再初期化する必要がありますか (これを試していないことに気付きました)。これらの余分なスレッドを強制終了する方法を知っている人はいますか?

ありがとう!

4

1 に答える 1