2011-04-26 2 views
1

루프 내에서 스트리밍 표시를 얻으려고합니다. 내 이해는 원칙적으로 버튼 밀기와 관련된 무한 루프를 넣음으로써 프로그램을 멈출 수 있다는 것입니다. 어떤 경우이 코드를 실행하면 실행중인 카운터가 제대로 인쇄되고 카메라의 프레임이 캡처됩니다 (일련의 파일로 저장할 수 있음). 그러나 setImage를 사용하는 디스플레이는 루프가 화면의 마지막 이미지를 표시합니다. 내 질문은 다음과 같습니다. 설명서에 설명 된대로 프로그램을 연속적으로 실행하는 경우 왜 디스플레이가 나타나지 않고 디스플레이 명령의 다른 쪽 코드도 제대로 처리됩니까? 디스플레이가 병렬 처리로 간단히 "덤프"되어 있습니까?이 경우 디스플레이가 완료 될 때까지 기다리는 지연 루프를 넣어야합니까?루프 내에서 연속적으로 여러 이미지를 표시합니다.

감사 WMW

uint32 MaxRuns = 10; 
for (uint32 NoRuns = 0 ; NoRuns < MaxRuns ; NoRuns++) 
{ 
// 
//Here is some code to capture each image from the camera 
//and save them to image.tif 
// 
inFilePath = @"/Volumes/Portable_Mac/Programming/CameraData/image.tif"; 
    [TestImage initWithContentsOfFile:inFilePath];  
[viewWindow setImage: TestImage]; 
    printf("run number:%d\n",NoRuns); 
} 

답변

2

도면은 다른 스레드에 떨어져 덤프되지 않지만이 지연됩니다. setImage:으로 전화하면보기의 image ivar이 변경되고 설정자는 setNeedsDisplay:으로 전화 할 가능성이 높습니다. 뷰를 다시 그려야한다는 신호입니다. 그러나 드로잉은 비용이 많이 드는 작업이므로 실행 루프의 gets done once per pass (특히 끝 부분) 만 for 루프가 끝날 때까지 발생하지 않습니다.

일련의 이미지를 표시하는 가장 좋은 방법은 거의 반복 타이머입니다 (performSelector:withObject:afterDelay:도 살펴볼 가치가 있습니다). 실제 도면에서 지연을 제외하고 설정하는 것이

- (void)changeDisplayedImage:(NSTimer *)tim { 
    // currImageIdx is an ivar keeping track of our position 
    if(currImageIdx >= [imageArray count]){ 
     [tim invalidate]; 
     return; 
    } 
    [viewWindow setImage:[imageArray objectAtIndex:currImageIdx]]; 
    currImageIdx++; 
} 

참고 :

[NSTimer scheduledTimerWithTimeInterval:2.5 
           target:self 
           selector:@selector(changeDisplayedImage:) 
           userInfo:nil 
           repeats:YES]; 

이 그런 다음 타이머의 동작이 뷰의 이미지를 변경합니다 : 배열에 모든 이미지를로드 한 후 타이머를 시작합니다 보기의 내용이 너무 빨리 나타나서 이미지를 보지 못할 것입니다. 정말 실제로보기를 즉각 그려야 할 경우 display을 보내면 (setNeedsDisplay: 설명에서 언급 한 것처럼) 작동해야합니다.

+0

감사합니다. 매우 유용합니다. 나는 당신의 대답을 철저히 고맙게 생각합니다. 궁극적으로 내 목표는 카메라에서 들어오는 이미지를 모니터링하고 카메라 특성을 "최적화"될 때까지 설정 한 다음 적합한 파일을 나중에 처리 할 수 ​​있도록 디스크에 저장하는 것입니다. –

+0

실제 코드는 다음과 같습니다 : NSImage * TestImage = [[NSImage alloc] initWithContentsOfFile : inFilePath] autorelease]; [viewWindow setImage : TestImage]; [viewWindow display]; NSImage를 다시 초기화하고 NSImageView에 즉시 표시하도록 요청해야했습니다. 이제 작동합니다. –

관련 문제