Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: краш программы при использовании Phonon
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Мультимедиа
Rocky
Подскажите пожалуйста что не так?

Взял пример из assistant. Написал в конструкторе класса
Phonon::MediaObject *music = Phonon::createPlayer(Phonon::MusicCategory, Phonon::MediaSource("G:/1.mp3"));
music->play();


Когда программа загружается полностью, музыка начинает проигрывать. А вот при выходе из программы получаю ошибку:
Цитата
Необработанное исключение в "0x7484cb27" в "PlayStationClient.exe": 0xC0000005: Нарушение прав доступа при чтении "0x03127a00".


И вылетаю в этот код (в файле medianode.cpp)
void MediaNodePrivate::deleteBackendObject()
{
    if (m_backendObject && aboutToDeleteBackendObject()) {
        delete m_backendObject;
        m_backendObject = 0;
    }
}


QT 4.6.1 MSVS 2008.

Что не так? (


Да и еще вопрос, ведь можно же скомпилить его (Phonon) отдельно от всего остального Qt? В смысле заново не перекомпилировать все QT?
kwisp
MediaNodePrivate
это что за класс? случаем не наследник QObject ???
Если у него есть хозяин то при выходе из программы если удаляются объекты, то может хозяин повторно пытается освободить уже свободную память?

зачем вообще его удалять?
Rocky
Разобрался) Если кому интересно, ща расскажу.

Блин, матерился почем свет стоит.. 3 часа угробил ) но понял в чем фишка.. Вобщем, я посмотрел адреса указателей (m_backendObject и его parent-a) в момент создания... а потом в момент удаления.. Они почему-то оказались разные. Соответсвенно первая мысль была что их кто-то или что-то затирает. И причем происходит этот в момент выхода, т.к. музыка-то играет "до последнего". Поставил брэйкпоинт в деструктор класса и в функцию удаления этого backendObject, думаю может что увижу... Каково же было мое удивление, когда я не провалился по этому брэйкпоинту в моем деструкторе и попал почему-то сразу к удалению backendObject (которое как я понимаю должно происходить уже после того, как я выйду из деструктора, потому что QT удаляет все созданные объекты-наследники от QObject уже при выходе из eventLoop-а). Причем этот мой класс - наследник от QMainWidget (тут мне сразу стало понятно почему не вызываются деструкторы самописных кнопок, о чем я тут недавно спрашивал). Долго не мог понять что за фигня... В конце концов выяснил (точнее вспомнил), что я запретил выход из программы кроме как по нажатию кнопки "выйти". А в ней стоял вызов exit(0). Сунулся в assistant... читал-читал нашел интересное:
Цитата
void QCoreApplication::quit () [static slot]
Tells the application to exit with return code 0 (success). Equivalent to calling QCoreApplication::exit(0).

Попробовал поставить qApp->quit() моментально попал к себе в деструктор. И все встало на свои места. Отработал деструктор, совершенно нормально удалился backendObject и все. Сталобыть exit(0) и qApp->exit(0) не одно и тоже. Хотя по обоим происходит выход из программы.. Только в первом случае непонятно что вообще происходит... И еще непонятно, exit(0) это какой? QEventLoop::exit или QThread::exit? Явно не QCoreApplication::exit раз он эквивалентен quit (с 0-м кодом)

Да, и еще возник вопрос про phonon.. хотя нет, лучше в другом треде это спросить)

kwisp, спасибо что откликнулся)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.