私は、私が合理的に知的な人だと思っていました。
リンゴの「スレッドプログラミングガイド」は、自己欺瞞を維持する私の自我を粉砕しました。Objective-Cを実行してメソッドを停止して再起動しますか?
私は、以下の例では二次スレッドで繰り返し実行したいメソッドがあります。
このメソッドの繰り返し呼び出しを繰り返して開始できるようにしたいと考えています。
コードがスレッドを開始します。
ブール値stuffToDoがtrueの場合、
それはdoStuffを呼び出します。
そう
それは少し休息を持っています。
それは私がそれを止めるように言うまで再びループします
私は現在のコードは何もしないときに 'stuffToDo'をチェックし続けるので、無駄に思えます。
私はstuffToDoを取り除き、必要に応じてスレッドをスポーンして取り消すことができます。
これはまた無駄に思えます。すでに実行しているスレッドが誤って新しいスレッドを生成しないように注意する必要があります。
私は答えは効率的に私の苦境を解決するために、Appleの「スレッドプログラミングガイド」の「実行ループの管理」セクションのどこかに見つけることができると確信しているが
は、おそらくそれは、カスタム入力ソース
を必要とするしかし、私は本当に午前この文書が挑戦的であることを発見した
この文書が私の脳の中にあまりにも多くのスレッドを生成し、計算が停止するようです。
enum eRenderThreadMode
{
render_not_started,
render_run,
render_cancel,
render_finished
};
- (IBAction) startThread:(id)sender
{
self.renderThreadMode = render_run;
label.text = @"doing stuff";
[NSThread detachNewThreadSelector:@selector(keepDoingStuff) toTarget:self withObject:nil];
}
- (void)keepDoingStuff
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
while (renderThreadMode == render_run)
{
if(stuffToDo)
{
[self doStuff];
}
else
{
[NSThread sleepForTimeInterval:kLittleRest];
}
}
self.renderThreadMode = render_finished;
[pool release];
}
- (IBAction)stopThread:(id)sender
{
self.renderThreadMode = render_stop;
while (self.renderThreadMode == render_cancel)
{
[NSThread sleepForTimeInterval:kLittleRest];
}
}
NSConditionLockを使用してください。これは標準的なスレッド構造です。 –
ありがとう、これは私が欲しいものを正確に行うように見える –
NSConditionLockではなく、提案されているようにNSConditionを使用しました。 Conditionではなく、実際にConditionLockを意味しましたか? もしそうなら、NSConditionLockを使ってこれを実装するとどう思いますか? 以前は、目的のCスレッドで作業していませんでしたが、さまざまなアプローチについて聞きたいと思っています。 –