2012-04-27 5 views
1

BT 장치에서 Mac으로 데이터를 읽는 응용 프로그램을 포팅합니다. 맥 특정 코드에서, - (void) rfcommChannelData : (...)와 같은 BT 콜백에 대한 델리게이트 메소드를 가진 클래스가있다.CFRunLoop 비 차단 버퍼 채우기 대기

콜백에서 필자는 수신 된 데이터로 버퍼를 채운다. 앱에서 호출 된 함수가 있습니다.

-(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; 
    } 
} 

이 RunLoop을 사용하면 전체 앱의 속도가 매우 느려집니다. 기본 모드를 사용하지 않고 runlooptimer로 내 runloop을 만들면 rfcommChannelData 콜백 메소드가 호출되지 않습니다. 나는 다음과 같은 코드로 내 하나 runloop를 만들 :

// 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 전체 응용 프로그램을 느리게하는 이유, 또는 얼마나 내 자신의 실행 루프 rfcommchannel에서 콜백을 허용하도록 트리거되는?

많은 감사,

안톤 Albajes-Eizagirre

답변

1

당신이 GUI 응용 프로그램의 주 스레드에서 작업하는 경우는, 자신의 방법에 내부적으로 실행 루프를 실행하지 않습니다. 실행 루프 소스를 설치하거나 프레임 워크의 비동기 API가 소스를 설치하도록 허용하고 메인 이벤트 루프로 돌아가십시오. 즉, 실행 흐름을 코드에서 다시 호출자에게 되돌려 보냅니다. 메인 이벤트 루프는 메인 스레드의 실행 루프를 실행하고, 소스가 준비되면 콜백이 실행되어 메소드를 호출합니다.