我想在循环中获得流式显示。我的理解是,原则上我可以通过放置与按钮推动相关联的无限循环来挂起程序。在任何情况下,当我运行此代码时,运行计数器打印出来就好了,并且捕获了来自摄像机的帧(我可以将它们保存为一系列文件。)但是,使用setImage的显示无需做任何事情直到结束循环时,它显示屏幕上的最后一个图像。我的问题是: 如果程序按照文档中的描述顺序运行,为什么不显示显示,而display命令另一端的代码处理得很好?显示器是否只是“转储”到一个并行进程中,在这种情况下我应该放一个等待显示完成的延迟循环?
由于 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);
}
答案 0 :(得分:2)
绘图不会转储到另一个线程,但会延迟。当您致电setImage:
时,视图image
ivar会发生变化,很可能设置者也会调用setNeedsDisplay:
。这就是视图需要重绘的信号。但是,因为绘图是一件昂贵的事情,它只能运行循环gets done once per pass(特别是在末尾),直到你的for
循环结束才会发生。
显示一系列图像的最佳方式几乎肯定是重复计时器(performSelector:withObject:afterDelay:
也值得一看)。将所有图像加载到一个数组中,然后启动计时器:
[NSTimer scheduledTimerWithTimeInterval:2.5
target:self
selector:@selector(changeDisplayedImage:)
userInfo:nil
repeats:YES];
然后你的计时器动作将改变视图的图像:
- (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++;
}
请注意,除了实际绘图的延迟之外,设置视图内容的速度可能会很快,您将看不到图像。如果确实希望您的视图立即绘制,则发送display
应该有效(如setNeedsDisplay:
说明中所述)。