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