2

内から新しい 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
4

1 に答える 1