последовательное отображение нескольких изображений в цикле - PullRequest
1 голос
/ 26 апреля 2011

Я пытаюсь получить потоковое отображение внутри цикла.Насколько я понимаю, я мог в принципе повесить программу, поместив бесконечный цикл, связанный, скажем, с нажатием кнопки.В любом случае, когда я запускаю этот код, счетчик хода печатается очень хорошо, и кадры с камеры захватываются (я могу сохранить их как серию файлов.) Однако отображение с помощью 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);
}

1 Ответ

2 голосов
/ 26 апреля 2011

Рисунок не выгружается в другой поток, но он откладывается. Когда вы звоните setImage:, image ivar представления изменяется, и, скорее всего, сеттер также вызывает setNeedsDisplay:. Это то, как представление сигнализирует о необходимости перерисовки. Поскольку рисование является дорогостоящим делом, однако, оно выполняется только один раз за проход (в частности, в конце) цикла выполнения, что не происходит до тех пор, пока цикл 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:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...