内から新しい NSThread (スレッド A) を起動する Cocoa アプリがあります applicationDidFinishLaunching
。
スレッド A は RFCOMM 接続を正常に作成し、別の NSThread (スレッド B) を生成して、確立された IOBluetoothRFCOMMChannel をスレッド B に渡します。次にスレッド A は、スレッド B が同期オブジェクトを通知するのを待ちます。
その意図は、データが到着すると、スレッド B の NSRunLoop がデリゲートを実行して、受信したデータをコピーし、スレッド A にそれを読み取るように通知することです。
ただし、スレッド B の NSRunLoop には入力ソースがないため、デリゲートは呼び出されません。setDelegate がその上に入力ソースを作成することを想像しました。デリゲートを呼び出す唯一の方法は、同期オブジェクトを待機する代わりに、スレッド A を独自の NSRunLoop で待機させることです。その場合、デリゲートが実行されます。
しかし、その取り決めは私にはうまくいきません。最終的に、私のコードは、標準であり、手続き的に流れる一連の関数としてのみ適している C API を公開する単なるライブラリになります。スレッド A は他の誰かのスレッド (おそらくメインではないかもしれません) になり、手続き的な方法で私のライブラリを呼び出します。
1)デリゲートコールバック(スレッドB)に登録されたスレッド/ランループは、入力ソースを取得し、そのランループでコールバックを実行するものだと思いました。しかし、スレッド A の NSRunLoop は代わりに入力ソースを取得します。これらの間の予想される関係は何ですか?
2) スレッド B を取得して入力ソースを取得し、デリゲートを実行するスレッドにするにはどうすればよいですか?
助けてくれてありがとう。
私のスレッドBは以下です:
@implementation CBaiHardwareBluetoothEventThread
- (void) runEventThread: (IOBluetoothObjectID)deviceID
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSRunLoop* myRunLoop = [NSRunLoop currentRunLoop];
CallbackDelegate* cd = [[CallbackDelegate alloc] init];
IOBluetoothRFCOMMChannel* myOBJCChannel = [IOBluetoothRFCOMMChannel withObjectID:deviceID];
[myOBJCChannel setDelegate:cd];
do{
[myRunLoop runUntilDate:[NSDate distantFuture]];
cout << __FUNCTION__ << " this should not be returning but it is ???" << endl;
usleep(1000000);//avoid the unintentional hard loop that happens
}while(1); //forever for now
[pool release];
}
@end