나는 작업을하고있는 백그라운드 스레드를 가지고있다 - 응용 프로그램을로드 중이다. 주 스레드가 UIProgressView에서 진행 상황을 표시하고 있습니다.한 스레드가 다른 스레드가 충돌했는지 어떻게 판단 할 수 있습니까?
몇 차례에
[self performSelectorInBackground:@selector(loadAppInBackground) withObject:self];
버그가 발생했습니다 (다른 접근 방식이 문제가 쉽게 해결 할 수있는 경우 그러나, 나는이 방법으로 결혼하고 있지 않다) 배경 스레드는 performSelectorInBackground로 양산되고있다 백그라운드 스레드가 크래시 (앱이 진행되는 다른 버그) 진행 막대가 멈추는 결과를 낳지 만, 사용자는 아무 것도 잘못되었음을 명확하게 알 수 없습니다.
나는이 상황을 감지하고 사용자가 대기 중에 포기할 때까지 매달리기보다는 정상적으로 실패하고 싶습니다.
로드 프로세스의 지속 시간이 크게 다를 수 있으므로 단순히 시간 초과가 이상적인 옵션이 아닙니다.
포 그라운드 스레드가 백그라운드 스레드가 실패했음을 감지하는 가장 좋은 방법은 무엇입니까? 포어 그라운드 스레드는 UI를 다루기에 바쁜 것이므로 첫 번째 스레드를 모니터링하기 위해 두 번째 백그라운드 스레드가 필요합니까? 그것은보기 흉한 것처럼 보입니다.
백그라운드 프로세스를 "ping"하는 데 사용할 수있는 스레드 간 통신 메커니즘이 있습니까? 더 나은 아직, 다른 스레드의 상태를 확인하는 낮은 수준의 시스템 메커니즘?
디버거는 실행중인 모든 스레드를 알고 있으며 상태를 알고있는 것 같습니다. 같은 일을 내 애플 리케이션에 사용할 수있는 전화가 있는지 궁금하네요.
이 백그라운드 작업 (GCD, NSOperations, NSThreads)은 어떻게 디스패치합니까? 대답은 구현에 따라 다릅니다. – CodaFi
[self performSelectorInBackground : @selector (loadAppInBackground) withObject : self]; –
타임 아웃은 주로 사용되는 기술입니다. 스레드가 정상적으로 실행 중인지 아니면 무한 루프에 있는지 (실행 중지 문제)를 판별하는 것이 불가능하기 때문입니다. 따라서 포어 그라운드는 백그라운드 작업이 1 초 (로컬 I/O 또는 네트워크 I/O의 경우 15 ~ 60 초)에 완료되었는지 확인할 수 있습니다. 미안하지만 일반적인 문제를 묻기 때문에 모호한 제안 만 할 수 있습니다. – HKTonyLee