首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CFRunLoop非阻塞等待缓冲区被填充

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

Stack Overflow用户
提问于 2012-04-28 00:12:53
回答 1查看 1.1K关注 0票数 1

在特定于mac的代码中,我有一个包含BT回调委托方法的类,比如-(void) rfcommChannelData:(...)

我有一个从应用程序调用的函数:

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

如果我不使用默认模式,而是使用runlooptimer创建on运行循环,则回调方法rfcommChannelData永远不会被调用。

代码语言:javascript
复制
//  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);

你知道为什么默认的RunLoop会减慢整个应用程序的运行速度吗?或者如何让我自己的run循环允许来自rfcommchannel的回调被触发?

非常感谢,

Anton Albajes-Eizagirre

EN

回答 1

Stack Overflow用户

发布于 2012-04-28 07:33:36

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

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

https://stackoverflow.com/questions/10354176

复制
相关文章

相似问题

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