2010-04-05 5 views
0

최근에 처리하기 위해 사전 계산 된 Grafix/Audio를 파일로 내보낼 수있는 프로젝트를 시작했습니다.시트 및 스레드 메모리 문제

내가 뭐하고 있었 모든 내 주요 XIB에서 (progressindicator 및 중단 버튼으로) 새로운 창을 배치하는 것입니다 다음과 같은 코드를 사용하여 열 :

[NSApp beginSheet: REC_Sheet modalForWindow: MOTHER_WINDOW modalDelegate: self didEndSelector: nil contextInfo: nil]; 

NSModalSession session=[NSApp beginModalSessionForWindow:REC_Sheet]; 
RECISNOTDONE=YES; 
while (RECISNOTDONE) { 
    if ([NSApp runModalSession:session]!=NSRunContinuesResponse) 
     break; 
    usleep(100); 
} 

[NSApp endModalSession:session]; 

백그라운드 스레드 (pthread에) 일찍 시작되었다 실제로 작업을 수행하고 모든 targas/wave 파일을 저장합니다. 어느 것이 좋았지 만 시간이 지나면 주 스레드가 더 이상 응답하지 않고 메모리 공간이 멈출 수없는 것으로 판명되었습니다. 나는 Instruments로 디버깅을 시도했고 무한대로 커지는 CFHash 등을 보았다.

우연히 나는 시트 아래를 클릭하고 임시로 도움을 주었고 메인 스레드 (AppKit?)가 물건을 풀어 놓았지만 잠시 동안.

나는 나에게 설명 할 수 없다. 우선 진행률을 업데이트하기 위해 내 스레드에서 진행률 표시 줄 (0.5 초 간격으로)에 액세스하는 것이라고 생각했기 때문에 잘라 냈다. 하지만 아무 것도 업데이트하지 않고 Progressbar를 사용하지 않아도 내 응용 프로그램은 "Main-Event"또는 기타 항목을 해제하지 않기 때문에 모든 메모리를 사용합니다.

메인 스레드 메모리 항목을 "소모"할 가능성이 있습니까 (Runloop/NSApp 호출?). 그리고 왜 도대체 메인 스레드가 (이 간단한 작업 후에) 더 이상 응답하지 않습니까 ???

더 이상 clou가 없습니다. 제발 도와주세요!

미리 감사드립니다.

P. 너희들은 어떻게 "스레드 된 긴 작업"을 구현하고 귀하의 GUI를 업데이트합니까 ???

+0

인스트루먼트에서 CFHash를 할당하는 부분을 확인하십시오. –

답변

1
while (RECISNOTDONE) { 
    if ([NSApp runModalSession:session]!=NSRunContinuesResponse) 
     break; 
    usleep(100); 
} 

당신이 그것을하고있는 이유가 있나요? 시트는 이와 같은 작업을 수행하지 않고 상위 창을 차단합니다. 앱 위임 내에서 종료를 방지 할 수 있습니다.

당신이 정말로 뭔가 위의 코드를 필요로 할 경우, 후 배수 그런 다음 runModalSession: 메시지를 전송하기 전에 오토 릴리즈 풀을 만들어보십시오 (하지만 당신은 NSRunContinuesResponse에 비교하고 휴식하기 전에).