1

동시성의 NS/Objective-C 모델을 알게되었습니다. 다음과 같은 명령 행 도구가 있다고 가정 해보십시오.NSTimer in command line tool

#include "myLibrary.h" 

void callback(void* parameter){ 
    cout<<"callback called.\n"; 
    //some logic... 
} 

int main(int argc, char* argv[]){ 
    myLibraryInit(callback); 
    std::string s; 
    while(true){ 
    cin>>s; 
    myLibrarysResponseTo(s); 
    } 
} 

내 라이브러리에는 두 가지 응답을하고 싶습니다. 하나는 반복 타이머를 시작하고 하나는 멈추는 타이머입니다. 타이머는 myLibraryInit에 의해 라이브러리에 제공된 콜백을 호출해야합니다.

iPhone/iPad 응용 프로그램에서 NSTimers를 사용 해왔고,이 문제는 다른 패러다임 명령 줄 도구에 기인한다고 생각합니다. 주 스레드는 main에 들어가서 프로그램이 끝날 때까지 끝내지 않습니다. 이것은 메인 러닝 루프를 돌리는 것이 자유롭지 않다는 것을 의미합니다. 이것은 타이머를 얻는 것입니다. 나는 생각한다. 그렇다면이 문맥에서 NSTimer를 어떻게 작동시킬 수 있습니까?

다른 점은 Apple NSTimer 설명서에서 번 스레드 NSTimer를 무효화해야한다고 말합니다.이 설치되었습니다. 나는 타이머를 무효로하고 싶을 때까지 타이머를 인스톨했을 때의 스레드를 파악하는 방법을 모르고 그것을 추적한다 (그리고 살아 있는지 확인한다). 스레드와 디스패치 대기열 사이의 명확한 매핑이 누락 된 경우인지, 루프를 실행하는지 또는 다른 것이 있는지 확실하지 않습니다. 핵심 블루투스를 사용하고 있으므로 다음과 같이 중앙 관리자를 초기화합니다.

_centralManager=[[CBCentralManager alloc] 
    initWithDelegate: self 
    queue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
]; 

콜백이 여기에서 트리거 될 수 있습니다. 콜백에 타이머를 정지시키는 라이브러리 함수를 호출하는 논리가 포함되어 있으면 무효화 된 스레드가 무엇인지 보증 할 수 없습니다. 그렇다면 타이머를 올바르게 무효화하려면 어떻게해야합니까?

나는 this 질문을 찾았지만 메인 루프가 타이머가 실행되는 루프와 동시에 발생할 수 없습니다.

나는 충분한 문맥을 주었으면한다. 답장을 미리 보내 주셔서 감사합니다.

답변

6

[GCD 또는 비동기 작업을 사용하는] 시스템 프레임 워크가 올바르게 작동하려면 dispatch_main()을 호출하거나 메인 스레드에서 NSRunLoop을 실행해야합니다.

main() 함수의 끝에서 [[NSRunLoop currentRunLoop] run];을 호출하는 것처럼 간단 할 수 있습니다. (킥오프 작업을 먼저 반환하지 않도록 설정하십시오.)

+0

이것은 모든 (Mac을 포함하지 않는) 사용자를위한 패러다임의 상당한 변화 일 것입니다. 다른 방법이 있습니까? NSTimer에 대한 좋은 대안? – CodeSoda

+0

@ CodeSoda 라이브러리를 메인 스레드가 아닌 다른 스레드로 격리시켜야합니다. 핵심은 * GCD 또는 NSRunLoop에 의해 사용되는 스레드 *를 차단하지 않는 것입니다. 즉, 라이브러리에서 System API를 사용하고자 할 때마다 라이브러리의 스레드보다 * 다른 * 스레드에서이를 수행하기를 원할 것입니다. – bbum

+0

그럼 내가 어떻게하고 싶은지에 대한 온전한 판단을 할 수 있을까요? 1) 하위 클래스 NSThead. 1a) 중간에서 중간 멤버 함수를 호출하는 타이머를 예약하십시오. 그런 다음 현재 실행 루프를 실행하십시오. 1b) 중간 멤버 함수에서 스레드가 취소되었는지 확인하십시오. 그렇다면 종료하고 그렇지 않으면 반복적으로 호출하는 데 관심이있는 함수를 호출하십시오. 2) 반복적으로 작업하기 : 서브 클래 싱 된 스레드를 할당, 초기화 및 시작하십시오. 3) 그 일을 반복적으로 중지하려면 스레드를 취소하십시오. – CodeSoda