首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOBluetooth同步读取

IOBluetooth同步读取
EN

Stack Overflow用户
提问于 2011-02-26 17:45:15
回答 1查看 1K关注 0票数 4

现在我正在开发一个使用IOBluetooth的程序,我需要同步读取,也就是说,我调用一个方法,它将给定的字节数写入端口,然后读取给定的字节数并返回它们。我目前有一个由NSThreads、NSLocks和NSConditions组成的复杂系统,虽然它可以工作,但速度非常慢。此外,在某些调用之后,我需要确保没有额外的数据,所以我通常会刷新缓冲区,但使用IOBluetooth的异步回调是不可能的--有没有想过如何确保无论如何,在特定点之后接收的所有数据都是在该点之后接收的数据?

我真的完全没有处理过这种类型的同步和多线程,因为到目前为止我所做的所有工作都是使用同步调用,所以我希望对这个问题有任何想法。

下面是传入数据的回调( "incomingData“对象为NSMutableData):

代码语言:javascript
复制
- (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];
}

下面的方法在返回数据对象之前等待,直到接收到给定的字节数(从另一个线程调用)。

代码语言:javascript
复制
- (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;
}
EN

回答 1

Stack Overflow用户

发布于 2011-09-22 23:34:51

以同步方式进行任何类型的IO/通信都会给您带来麻烦。

通过对应用程序逻辑使用简单的状态机,可以避免多线程和锁。每当接收到数据时,状态机都会被触发,并可以处理数据。如果所有数据都在那里,您可以在应用程序中执行下一步。如果您愿意,您可以使用同步调用进行发送,因为它只会使用蓝牙系统丢弃数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5126175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档