Конфликт между QTMovie / QTMovieView и пользовательской платформой C ++ - PullRequest
1 голос
/ 23 сентября 2011

У меня возникла безумная проблема ...

Простое Какао приложение с QTMovieView , в котором установлен определенный файл фильма или приложение, котороезагружает и рендерит QTMovie работает нормально, однако, если я просто свяжу свой собственный Objective C ++ framework , приложение всегда будет зависать / зависать бесконечно сразу после первой [QTMovie play] или [QTMovie autoplay] call ...

Мой пользовательский фреймворк довольно сложный, но я даже не представляю, как он может конфликтовать с QTMovie поскольку выполняется только статическая логика инициализации, среда отлично работает с приложением контейнера Какао , исключений и сигналов нет, даже valgrind не может ничего обнаружить.Однако существует оператор new перегрузки, но его отключение не помогает ... Кроме того, не имеет значения, из какого потока осуществляется доступ к QTMovie - результатвсегда одно и то же ...

Изменение настроек компилятора, синхронизация настроек компилятора с настройками фреймворка не оказывают влияния, сами по себе настройки компилятора не вызывают никаких проблем.

Кроме того, если я инициализирую QTMovie ИЛИ QTMovieView , динамически загрузите мой фреймворк и вызовите метод [QTMovie play] или [QTMovie autoplay] , поток это былвызывается также будет тупик ...

Может ли кто-нибудь , пожалуйста, помогите мне понять, что может вызвать эту проблему?!

Ответы [ 3 ]

0 голосов
/ 30 сентября 2011

Только из вашего описания трудно понять точную последовательность звонков, которые происходят.Однако, когда я видел зависания, которые соответствуют общему описанию того, что вы делаете в прошлом, это обычно были проблемы статической инициализации.Вы упоминаете, что у вас есть только выполняемая логика статической инициализации, что, на мой взгляд, делает это еще более вероятным.

Проблема в том, что статические области действия файлов не гарантируются для инициализации в любом порядке.Таким образом, иногда случается так, что иногда вы можете получить различия в порядке инициализации в зависимости от того, в какие библиотеки вы ссылаетесь.

Итак, если у вас есть два объекта A и B, а B зависит от A, вы можете найтичто большую часть времени инициализаторы для A вызываются первыми, и все работает, но затем вы связываете новую библиотеку, и внезапно B назначается первым.Так как он использует неинициализированный A, может произойти все что угодно, от доступа к недопустимым / не отображенным адресам памяти до возврата нечетных значений, используемых в случаях if / else для странного выполнения программы или странного поиска контейнера и т. Д. *

Существуют методыустранения этих видов статических проблем инициализации.См. эту статью по решению фиаско статической инициализации .

0 голосов
/ 02 октября 2011

Я торгую QTMovieView только как экран.Для некоторых простых приложений я также использую его для обработки всего этого:

[myQTMovieView setMovie: ((QTMovie *) [QTMovie movieWithFile: ошибка файла: & error])];

[[myQTMovieView movie] stop];

[[myQTMovieView movie] autoplay];

, таким образом, вы никогда не будете запускать QTMovie.

0 голосов
/ 29 сентября 2011

Райан, что заставляет вас думать, что существует конфликт между QTMovie и QTMovieView?Вы пытались исключить QTMovieView, нормально ли работает QTMovie без него?Вы должны быть в состоянии услышать звук по крайней мере.Если проблема связана с QTMovie, в чем я сомневаюсь, вы могли бы вместо этого использовать QTMovieLayer.

Также вы сказали, что используете потоки, QTMovie - капризная вещь, вам всегда нужно создавать ее в основном потоке.Если вы хотите использовать его в другом потоке, убедитесь, что вы успешно отсоединили его и подключили к новому потоку.В новой теме вам нужно позвонить [QTMovie enterQTKitOnThread] или [QTMovie enterQTKitOnThreadDisablingThreadSafetyProtection], прежде чем начать что-либо делать с фильмом.Кроме того, [QTMovie exitQTKitOnThread] должен вызываться после того, как фильм был отсоединен от потока и поток завершается.

...