2011-11-15 10 views
0

新しいスレッドでデーモンを起動したいのですが、自分のプログラムがデーモンからの入力を待っている間にロックされませんが、メインプログラムがデーモンから情報を取得する方法が必要です。私は新しいスレッドを起動するためにNSThreadを使用しましたが、NSThreadでデリゲートを使用する方法はわかりません。非同期にNSThreadを実行しますが、デリゲートを使用しますか?

詳細については、ネットワークからデータを受信するQuartz Composer用のカスタムパッチを作成しています。アイデアは、2番目のスレッドがデーモンを実行できるということです。各フレームで、デーモンスレッドが新しいデータを受け取ったときにデリゲートメソッドによって設定されたivarから新しいデータを取得します。中断はありません。

NSThreadでこれを行うことはできますか?私が見なければならないよりよい方法はありますか?

答えて

1

編集:あなたはこのパターンを使用し、メインスレッド上で発生するデリゲートのコールバックをする場合: [デリゲートperformSelectorOnMainThread:@selector(threadDidSomething :) withObject:自己waitUntilDone:NO]ここ

あなたが行きます。私はこれが自明であると信じていますが、そうでなければ私に知らせてください。注:APIに基づいてこのコードを書きましたが、テストしていないので注意してください。

@protocol ThreadLogicContainerDelegate <NSObject> 
- (void)threadLogicContainerDidStart:(ThreadLogicContainer*)theThreadLogicContainer; 
- (void)threadLogicContainerDidFinish:(ThreadLogicContainer*)theThreadLogicContainer; 
@end 

@interface ThreadLogicContainer 

- (void)doWorkWithDelegate:(id<ThreadLogicContainerDelegate>)delegate; 

@end 

@implementation ThreadLogicContainer 

- (void)doWorkWithDelegate:(id<ThreadLogicContainerDelegate>)delegate 
{ 
    @autoreleasepool 
    { 
     [delegate threadLogicContainerDidStart:self]; 

     // do work 

     [delegate threadLogicContainerDidFinish:self]; 
    } 
} 

@end 


@interface MyDelegate <ThreadLogicContainerDelegate> 
@end 

@implementation MyDelegate 
- (void)threadLogicContainerDidStart:(ThreadLogicContainer*)theThreadLogicContainer 
{} 
- (void)threadLogicContainerDidFinish:(ThreadLogicContainer*)theThreadLogicContainer 
{} 
@end 

使用例:

ThreadLogicContainer* threadLogicContainer = [ThreadLogicContainer new]; 
[NSThread detachNewThreadSelector:@selector(doWorkWithDelegate:) 
         toTarget:threadLogicContainer 
         withObject:myDelegate]; 

参照:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html

+0

非常に役に立ちました! – Adam

2

あなたはまた、代わりにNSThreadの操作キュー(NSOperation)またはディスパッチキュー(GCD)を使用して検討する必要があります。

まだお持ちでない場合は、AppleのConcurrency Programming Guideをご覧ください。明示的なスレッド作成ではなく、キューベースのアプローチを推奨しています。

関連する問題