4

現在、IOBluetoothを使用するプログラムに取り組んでおり、同期読み取りが必要です。つまり、メソッドを呼び出し、指定されたバイト数をポートに書き込み、指定された数を読み取って返します。私は現在、NSThreads、NSLocks、およびNSConditionsの複雑なシステムを持っていますが、それは一種の動作ですが、非常に低速です。また、特定の呼び出しの後、余分なデータがないことを確認する必要があるため、通常はバッファをフラッシュしますが、IOBluetoothの非同期コールバックでは不可能です-何があっても、すべてのデータが後に受信されたことを確認する方法についての考え特定のポイントは、そのポイントの後に受信されたデータですか?

これまでに行った作業はすべて同期呼び出しを使用しているため、このタイプの同期とマルチスレッドについてはまったく扱っていません。この問題について考えていただければ幸いです。

着信データのコールバックは次のとおりです(「incomingData」オブジェクトはNSMutableDataです)。

- (void)rfcommChannelData:(IOBluetoothRFCOMMChannel*)rfcommChannel data:(void *)dataPointer length:(size_t)dataLength {
    [dataLock lock];
    NSData *data = [NSData dataWithBytes:dataPointer length:dataLength];
    [incomingData appendData:data];

    if (dataWaitCondition && [incomingData length] >= bytesToWaitFor) {
        [dataWaitCondition signal];
    }

    [dataLock unlock];
    [delegate bluetoothDataReceived];
}

そして、これがデータオブジェクトを返す前に指定されたバイト数が受信されるまで待機するメソッドです(これは代替スレッドから呼び出されます)。

- (NSData *)waitForBytes:(int)numberOfBytes {

    bytesToWaitFor = numberOfBytes;
    [dataLock lock];
    dataWaitCondition = [[NSCondition alloc] init];
    [dataWaitCondition lock];
    [dataLock unlock];
    while ([incomingData length] < numberOfBytes) {
        [dataWaitCondition wait];
    }
    [dataLock lock];
    NSData *data = [incomingData copy];
    [dataWaitCondition unlock];
    dataWaitCondition = NULL;
    [dataLock unlock];

    return data;
}
4

1 に答える 1

0

あらゆる種類の IO/通信を同期的に行うと、問題が発生します。

アプリケーション ロジックに単純なステート マシンを使用することで、マルチスレッドとロックを回避できます。データが受信されるたびに、ステート マシンがトリガーされ、データを処理できます。すべてのデータが存在する場合は、アプリで次のステップを実行できます。Bluetoothシステムでデータをドロップするだけなので、必要に応じて送信に同期呼び出しを使用できます.

于 2011-09-22T15:34:51.033 に答える