Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos CFRunLoop非阻塞等待缓冲区被填充_Macos_Callback_Bluetooth_Wait_Runloop - Fatal编程技术网

Macos CFRunLoop非阻塞等待缓冲区被填充

Macos CFRunLoop非阻塞等待缓冲区被填充,macos,callback,bluetooth,wait,runloop,Macos,Callback,Bluetooth,Wait,Runloop,我正在将一个从BT设备读取数据的应用程序移植到Mac。在mac特定的代码中,我有一个类,其中包含BT回调的委托方法,如-(void)RfcomChannelData:(…) 在那个次回调中,我用接收到的数据填充一个缓冲区。我有一个从应用程序调用的函数: -(int) m_timedRead:(unsigned char*)buffer length:(unsigned long)numBytes time:(unsigned int)timeout { double steps=0.01; d

我正在将一个从BT设备读取数据的应用程序移植到Mac。在mac特定的代码中,我有一个类,其中包含BT回调的委托方法,如-(void)RfcomChannelData:(…)

在那个次回调中,我用接收到的数据填充一个缓冲区。我有一个从应用程序调用的函数:

-(int) m_timedRead:(unsigned char*)buffer length:(unsigned long)numBytes time:(unsigned int)timeout
{

double steps=0.01;
double time = (double)timeout/1000;
bool ready = false;
int read,total=0;
unsigned long restBytes = numBytes;
while(!ready){
    unsigned char *ptr = buffer+total;
    read = [self m_readRFCOMM:(unsigned char*)ptr length:(unsigned long)restBytes];
    total+=read;
    if(total>=numBytes){
        ready=true; continue;
    }
    restBytes = numBytes-total;
    CFRunLoopRunInMode(kCFRunLoopDefaultMode, .4, false);       
    time -= steps;
    if(time<=0){
        ready=true; continue;
    }
}
知道为什么默认运行循环会减慢整个应用程序的速度,或者如何让我自己的运行循环允许触发来自rfcommchannel的回调吗

非常感谢,


Anton Albajes Eizagirre

如果您正在处理GUI应用程序的主线程,请不要在自己的方法内部运行run循环。安装运行循环源(或者允许框架的异步API代表您安装源),然后返回主事件循环。也就是说,让执行流从代码返回到调用方。主事件循环运行主线程的运行循环,当源准备就绪时,它们的回调将触发,这可能会调用您的方法。

如果您在GUI应用程序的主线程上工作,请不要在内部对您自己的方法运行运行循环。安装运行循环源(或者允许框架的异步API代表您安装源),然后返回主事件循环。也就是说,让执行流从代码返回到调用方。主事件循环运行主线程的运行循环,当源准备就绪时,它们的回调将触发,这可能会调用您的方法

//  CFStringRef myCustomMode = CFSTR("MyCustomMode");
//  CFRunLoopTimerRef myTimer;
//  myTimer = CFRunLoopTimerCreate(NULL,CFAbsoluteTimeGetCurrent()+1.0,1.0,0,0,foo,NULL);   
//  CFRunLoopAddTimer(CFRunLoopGetCurrent(), myTimer, myCustomMode);
//  CFRunLoopTimerInvalidate(myTimer);
//  CFRelease(myTimer);