9

メインスレッドでNSThreadを使用してサブスレッドを作成しました

NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(MyThread:) object:timer];

5秒後、メインスレッドで[newThread cancel]を使用してサブスレッドを停止しましたが、機能しませんでした。

メソッドMyThread:newThreadではまだ機能しています

だから、newThread、THXを停止するための正しい答えは何ですか

実際には[newThreadisCancelled]はYESですが、セレクターMyThreadはまだ起動していました

4

2 に答える 2

11

メソッドは、cancelキャンセルされたことをスレッドに通知するだけです(前述のように、 が に変更されますisCancelledYESその後、これをチェックして終了するのはスレッド自体の責任です。たとえば、MyThread:メソッドでこれを行うことができます:

// At some checkpoint
if([[NSThread currentThread] isCancelled]) {
    /* do some clean up here */
    [NSThread exit];
}

このチェックを定期的に行い、示されているようにスレッド内から終了する必要があります。それ以外の場合はcancel効果がありません。

于 2010-07-07T02:14:21.360 に答える
2

-(無効)キャンセル

考察 このメソッドのセマンティクスは、NSOperation オブジェクトに使用されるものと同じです。このメソッドは、isCancelled メソッドによって反映される状態情報をレシーバーに設定します。キャンセルをサポートするスレッドは、定期的に isCancelled メソッドを呼び出して、スレッドが実際にキャンセルされたかどうかを判断し、キャンセルされている場合は終了する必要があります。

詳細については、NSThread API リファレンスを参照してください。

于 2010-10-05T13:46:55.987 に答える