2012-04-09 7 views
0

iOSのマルチスレッドで同等のパターンを探していますが、これはパルスと待機のための.NETと同じです。基本的には、フラグが設定されるまでバックグラウンドスレッドを休止状態にして、基本的にスレッドを動作させるようにします。iOSパルスと同等のスレッディングと

これはloop + thread.sleep()の代替です。フラグは、処理を行っている実際のバックグラウンドスレッドとは別のスレッドで設定できます。ありがとう!

+3

それは悪いモデルです。どのスレッドがジョブを行うかを気にする特別な理由がない限り、スレッドプールを使用します。ジョブを終了したいときは、プールにキューを入れてください。それ以外の場合は、スレッドを浪費し、リソースを浪費し、余分なコンテキストスイッチを強制します。 –

+0

多くの提案がありました(NSThread、GCDのセマフォなど)。上記のDavidの提案は、他のスレッドが変更を検出するのを待っているフラグを設定するのではなく、単純な 'dispatch_async()'を実行して処理を実行するプロセスを開始するだけです。マッスルはありません。難なく。 – Rob

答えて

2

iOSとOS Xにはさまざまな種類のミックスマッチスレッドAPIが用意されています。あなたはスレッドを作成するために何を使用していますか?

最も簡単な提案は、Grand Central Dispatch (GCD) semaphoreを使用することです。

セットアップコード:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 
// Then make sure your thread has access to this semaphore 

スレッドコード:

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
// Will block forever until the semaphore is triggered 

トリガーコード:

dispatch_semaphore_signal(semaphore); 

アンより良い提案:GCDはすでに独自のスレッドプールを管理し、これだけ取ります自分のスレッドをスピンアップするのではなく、それを利用する利点があります。バックグラウンドスレッドでコードを実行するには、dispatch_asyncを使用するのは非常に簡単です。

0

私は.NETのこのパターンに慣れていませんが、意図的にスレッドをロックするのは悪い考えです(そのスレッドは続行できない限り、ほとんどの時間待つか、少なくとも長期間)。

これはスケジューラには悪いもので、システムリソースには悪いものです。

NSThreadの+ detachNewThreadSelector:...メソッドを使用して、新しいスレッドを作成することができます。そして、NSObjectの-performSelectorOnMainThreadのような単一の場所に、そのようなスレッドを作成し、維持するためのロジックを管理するために、さまざまなアイデアを使用することができます:

+0

正しい。基本的には、タスクをシリアル形式で実行するバックグラウンドスケジューラがありますが、メインスレッドとは別のスレッドで実行されます。これらのタスクのそれぞれは、インターネット接続によって異なります。インターネット接続がダウンしている場合、私はこれらのタスク(または投票)を実行したくありません。私はそれを一時停止し、インターネット接続が復旧するまで待つことを望みます。 – user1296763

+0

したがって、メインスレッド上で-internetConnectionDownのようなものだけをヒットさせ、スレッドをクリーンアップし、インターネットが再び利用可能になったときにNSNotificationに登録するメソッドを作成します。次に、子スレッドを作成して、それらのスレッドを再び実行させることができます。これは、インターネット接続が確立するまで、それらの子スレッドでブロックするのと同じではないことに注意してください。私は、インターネット接続が見つからない場合に子スレッドを分解し、そうであれば設定することを提案します。 –

関連する問題