gpt4 book ai didi

macos - IOBluetooth 事件委托(delegate)仅在不需要的 NSRunLoop 中执行

转载 作者:行者123 更新时间:2023-12-03 16:32:36 26 4
gpt4 key购买 nike

我有一个 Cocoa 应用程序,它从 applicationDidFinishLaunching 中启动一个新的 NSThread(线程 A)。

线程 A 成功创建 RFCOMM 连接,然后生成另一个 NSThread(线程 B),将已建立的 IOBluetoothRFCOMMChannel 传递给线程 B。线程 B 创建一个 IOBluetoothRFCOMMChannelDelegate 并用它调用 IOBluetoothRFCOMMChannel 上的 setDelegate,然后运行其当前的 NSRunLoop。然后线程 A 等待线程 B 发出同步对象信号。

其目的是,当数据到达时,线程 B 的 NSRunLoop 将执行委托(delegate),复制接收到的数据并通知线程 A 读取数据。

但是,委托(delegate)永远不会被调用,因为线程 B 的 NSRunLoop 没有输入源。我想象 setDelegate 会在其上创建一个输入源。我可以调用委托(delegate)的唯一方法是让线程 A 等待其自己的 NSRunLoop 而不是等待同步对象。在这种情况下,委托(delegate)将被执行。

但这种安排对我不起作用。最终,我的代码将只是一个公开 C API 的库,该 API 是一个标准,并且仅适合作为程序流动的函数集。线程 A 将是其他人的线程(也许是主线程,也许不是),并将以程序方式调用我的库。

1) 我认为注册委托(delegate)回调的线程/运行循环(线程 B)是获取输入源并在其运行循环中执行回调的线程/运行循环。但是线程 A 的 NSRunLoop 却获取了输入源,为什么呢?这些事物之间的预期关系是什么?

2) 如何让线程 B 获取输入源并成为执行委托(delegate)的线程?

感谢您的所有帮助。

我的主题 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

最佳答案

IOBluetooth 和线程很困惑。你必须通过反复试验来解决这个问题。如果回调似乎发生在打开连接的线程上,那么您必须在需要回调的线程上打开连接。此外,这种行为在操作系统版本之间经常会发生变化......

关于macos - IOBluetooth 事件委托(delegate)仅在不需要的 NSRunLoop 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com