crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в краш программы при использовании Phonon
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Rocky Дата 12.2.2010, 17:36
  Разобрался) Если кому интересно, ща расскажу.

Блин, матерился почем свет стоит.. 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, спасибо что откликнулся)
kwisp Дата 12.2.2010, 12:34
  MediaNodePrivate
это что за класс? случаем не наследник QObject ???
Если у него есть хозяин то при выходе из программы если удаляются объекты, то может хозяин повторно пытается освободить уже свободную память?

зачем вообще его удалять?
Rocky Дата 11.2.2010, 23:13
  Подскажите пожалуйста что не так?

Взял пример из 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?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 16.4.2024, 8:47