2012-02-02 3 views
2

Так что я пытаюсь взять объект QTMovie с переменным размером (от нескольких МБ до более ГБ) и использовать writeToFile:withAttributes: для экспорта на диск. Поскольку это занимает много времени и блокирует пользовательский интерфейс, я решил поместить его в другой поток, используя Grand Central Dispatch.Как остановить QTMovie от замораживания пользовательского интерфейса моего приложения?

Насколько я могу судить, это работает отлично, за исключением того, что writeToFile:withAttributes: все еще блокирует приложение. Он экспортирует файл, но вы не можете ничего сделать с пользовательским интерфейсом, пока он не будет завершен.

Я просмотрел все документы по использованию нескольких потоков с QTKit и различными местами в Google, но ничего, что я пробовал, похоже, работает.

Ниже приведен код, который, как представляется, имеющие проблемы:

[movie detachFromCurrentThread]; 

dispatch_queue_t combineQueue = dispatch_queue_create("com.Combinate.movieCombineQueue", NULL); 

dispatch_async(combineQueue, ^{ 

    [QTMovie enterQTKitOnThreadDisablingThreadSafetyProtection]; 
    [movie attachToCurrentThread]; 
    [movie writeToFile:filepath withAttributes:exportAttributes]; 

    [movie detachFromCurrentThread]; 
    [QTMovie exitQTKitOnThread]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [movie attachToCurrentThread]; 
     [self finishedCombiningAudioFiles:(QTMovie *)movie]; 
    }); 

}); 

dispatch_release(combineQueue); 

ответ

0

Так что я пытался сделать запись фильма на фоне потока также, и я использовал пример кода Apple, имел который очень похоже на то, что у вас есть, но я нашел что-то странное.

Я начал пытаться увидеть, где пробой был и я обнаружил, что

[movie detachFromCurrentThread] 

был неудачников (вы можете проверить себя очень быстро, он возвращает успех BOOL.

Я не могу понять, Что останавливая QTKit от выполнения отсоединения, я пробовал устанавливать различные атрибуты и ничего не менял, что отказ от отсоединения. Его немного странное, что не отсоединение не вызывает никаких проблем, но по какой-то причине он, похоже, заставляет остальную часть кода чтобы продолжать движение по основному потоку. Он по-прежнему работает, когда он не может отсоединиться, он просто делает то, что вы говорите, и замерзает пользовательский интерфейс.

Далее зондированию дало мне исправить, если вы погрузитесь немного глубже в QuickTime каркасов вы можете получить функцию:

OSErr er = DetachMovieFromCurrentThread([movie quickTimeMovie]); 

, который на самом деле сделать отсоединение для меня, когда выходит из строя вызова QTKit. Затем фильм счастливо написан в фоновом режиме, и пользовательский интерфейс больше не зависает.

Надеюсь, что все будет зависеть от вас.

+0

Спасибо за помощь. Это фактически указывало мне в правильном направлении. По-видимому, метод '- (Movie) quickTimeMovie' недоступен для 64-битных приложений, только 32-разрядных приложений. Я думаю (не уверен в этом), что '- (BOOL) detachFromCurrentThread' фактически использует' DetachMovieFromCurrentThread' в его реализации, что объясняет, почему он терпит неудачу. Чтобы заставить его работать, все, что мне нужно было сделать, это конвертировать приложение для компиляции как 32-битное, а не 64-битное. Вряд ли идеальный, но по крайней мере он работает. – jcocoa5

Смежные вопросы