2

미리 감사드립니다.Objective-C 및 Quartz Composer; [qcView pauseRendering]은 Bad_Access를 야기합니다.

나는 Quartz Composer View (아래 qcView)를 가지고 있으며 QCView의 중간에 'home'이 될 때까지 임의의 방향으로 이미지 (코드 궁금한 점이 있다면 개미)를 이동합니다. pauseRendering은 앤트 움직임을 인치 단위로 볼 수 있도록 필요합니다. 그것없이 개미가 단지 '집'에 나타날 것입니다.

while([self distance] > acceptableOffset){ 
    [qcView pauseRendering]; 
    [self moveTowardsDestination:@"home"]; 
    [qcView resumeRendering]; 
} 

이것은 단일 개미에 대해 완벽하게 작동합니다.

방정식에 다른 개미를 추가 할 때 디스패치 대기열과 두 개의 블록을 사용합니다. 우리가 찾고있는 정확한 동작 -이 코드가 실행되면

dispatch_async(queue, ^{ 
     [theAnt findCenter]; 
    }); 

    dispatch_async(queue, ^{ 
     [otherAnt findCenter]; 
    }); 

는 두 이모는 자신의 집의 동시에 서둘러. 그러나 실행을 중단하고 다시 빌드하면 [qcView pauseRendering] 메서드 내에서 어딘가에서 Exc_Bad_Access를 즉시 얻을 수 있습니다. 깨끗한 후 & 빌드를 한 번 더 실행하면 완벽하게 작동합니다. pauseRendering 및 resumeRendering을 제거하면 개미가 즉시 집에 나타납니다.

지속적으로 커지고 축소되는 QCView pauseRendering 메서드에 로컬 인 배열이 있으며, 단일 QCView와 여러 블록에 액세스하면 문제의 근원을 볼 수 있습니다.

나는 QCView documentation을 조사했으며 영감을 얻은 것처럼 보이지 않습니다. pauseRendering에 대한 문서는 최소한입니다. 아무도 당신처럼 어리석은 무언가를 시도해 본 적이 없지만, 누군가가 QCView를 수정하는 경험을 쌓았을 것이고, 나를 오른쪽으로 가리킬 수있을 것입니다. (오류 ... "ANY!") 방향 .

[편집 : 나는의 변화를 시도했다 "동안 ([qcView isPausedRendering]!)", 즉 도움이된다면.]

답변

2

당신이 QCView 인스턴스가 실제로 동시성을 지원하는지 확인 있습니까?

매우 드뭅니다. 별도의 쓰레드 나 큐의 뷰를 배경 큐/쓰레드와 동시에 사용하지 않는 경우라도 QCView의 동시성 규칙을 위반할 가능성이 큽니다.

나는 주 스레드에서 또는 적어도 한 번에 하나의 스레드에서보기를 조작해야한다고 생각합니다.

(불행히도 이에 대한 구체적인 정보를 찾을 수 없습니다.)

+0

빠른 답장을 보내 주셔서 감사합니다.문서가 겉보기에 희박하고 이후 Google 검색은 'qcview 동시성'에 대한 관련 결과를 산출하지 않습니다. 직관적으로 잠그는 절차가 일시 중지 문제를 해결할 수 있다고 생각하십니까? –

+0

아마도 그렇지 않습니다. 일반적으로 내부 구현을 제어 할 수 없기 때문에 잠금 장치를 두어 스레드로부터 안전하게 할 수는 없습니다. http://lists.apple.com/에 Quartz Composer 목록이있을 것이라고 생각합니다. 그렇다면 QC 엔지니어 중 한 명에게 연락 할 가능성이 더 높습니다. – bbum

1

해결되었습니다.

나는이 문제를 크게 과대 평가했다. 간단한 사용 수정

 usleep(10000); 

이동 그림.

이것은 원래 코드에 포함되어 있지만 dispatch_suspend()를 대신하여 대체되었습니다. 현탁 직전의 수면 상태에서 원하는 활동이 이루어집니다.

누구든지 비슷한 문제가 발생하면 저에게 이메일을 보내 주시기 바랍니다.

+2

만약'usleep()'을 동기화 프리미티브로 사용한다면, 당신은 그것을 잘못하고있다. 겉으로보기에는 알 수없는 이유로 언젠가는 미래에 깨질 수 있습니다. – bbum