2010-02-23 3 views
0

스크립팅 브리지를 사용하여 내 코코아 응용 프로그램에서 iTunes를 쿼리하고 있습니다. 때로는 iTunes가 팝업창을 열어 팝업창이 열려있는 동안 iTunes에서 정보를 얻을 수 없습니다. 따라서 iTunes가이 상태에있을 때 정보를 요청하면 해당 팝업 창이 닫힐 때까지 응용 프로그램이 완전히 잠 깁니다.특정 시간 동안 코드를 실행하고 필요한 경우 삭제하십시오.

그래서 나는 그것을 별도의 스레드에서 간단한 응답을 얻을 수 있는지 확인하기 위해 뭔가 간단한 itunes 요청할 수있는 일종의 메커니즘이 필요 ... 그리고 그 별도의 스레드가 짧은 기간 내에 응답을받지 못하면 내 주요 스레드는 단지 그 스레드를 죽일 것이고 따라서 특정 시간에 itunes를 질의하지 않는 것을 알 것이다.

이러한 메커니즘을 만드는 방법에 대한 아이디어가 있습니까? 스레드를 죽일 수있는 방법을 찾았지만 아무 것도 찾지 못했습니다.

답변

1

문제는 스레드와 관련이 없습니다. 시간 초과가 너무 길다는 것입니다. 약 1 분 후에 당신이하는 일은 모두 실패해야합니다.

이 문제를 해결하려면 the SBApplication objectsetTimeout: 메시지를 보내고 기다리는 시간을 전달하십시오. 값은 틱 단위이며 초당 정확히 60 개입니다.

(일부 소스가 60.15 말, 그리고 애플의 문서는 "약"(60)을 말하지만, 난 그냥 TickCount 십 분의 가치를 측정하고, 6백초에 의해 분할의 결과가 정확히 내가 사용 60.0 코드이다.
NSLog(@"Ticks per second: %f", (end - start)/(60.0 * numMinutes));endstart은).

+0

와우 피터, 정말 고마워. 그게 다야! 시간 초과가 발생할 때까지 충분히 기다리지 않았습니다. 값을 조정하지 않고 테스트했고 시간 초과가 2 분이 걸렸습니다. 그런 다음 제안 사항을 수락하고 타임 아웃을 300 틱 (예 : 5 초)으로 설정하고 5 초 내에 시간 제한을 초과하여 앱의 인터페이스를 다시 사용할 수있게되었습니다. 이것은 나의 인생을 매우 더 쉽게한다. 그래서 팁을 위해 다시 감사해라! – regulus6633

0

NSOperation/NSOperationQueue를 확인하십시오.

+0

감사 TickCount의 결과이지만 그 바라 보았다. NSOperation은 NSThread와 똑같은 "취소"명령을 가지고 있으며, 동일한 문제가 있습니다 ... "작업"이 멈추었을 때 취소되지 않았는지 확인하기위한 기회가 결코 없을 것입니다. 나는 그것을 죽이는 방법이 필요하고 그것을 취소하는 것은 아닙니다. 해결책이 있지만 마음에 들지 않습니다. 나는 NSTask에서 osascript를 사용하여 applescript 명령을 실행합니다. 나는 별도의 스레드에서 실행 한 다음 작업이 내 스레드에서 실행 중인지 확인합니다. 짧은 시간이 지난 후에도 계속 실행 중이면 작업을 중단하고 iTunes를 쿼리하지 않는 것이 좋습니다. – regulus6633

+0

ostascript 명령을 사용하는 NSTask는 필요한 것보다 많은 오버 헤드가 있으므로 다른 솔루션도 환영하므로 여전히 NSThread 솔루션을 찾고 싶습니다. – regulus6633

관련 문제