Здравствуйте, гость ( Вход | Регистрация )
SABROG | Дата 3.1.2009, 21:12 |
что сие значит для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана deleteLater(). т.е что как на деле это происходит ? Для многопоточных приложений. Есть гуишный QEventLoop, у каждого нового потока свой QEventLoop. Если где-то в потоке зациклить через while(1) код, то возвращение в eventloop никогда не вернется и объект через deleteLater удален не будет. Т.ч. на деле это обычно выглядит так: - жмешь кнопку - приходит сигнал clicked() - вызывается слот on_button_clicked() - в слоте вызывается deleteLater() - происходит выход из слота - возвращение в код, где был emit сигнала clicked() - возвращение в главный eventloop - удаление объекта |
|
bobdva | Дата 2.1.2009, 19:57 |
что сие значит для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана deleteLater(). т.е что как на деле это происходит ? |
|
йцукен | Дата 28.12.2007, 15:51 |
Понял, спасибо. | |
ViGOur | Дата 28.12.2007, 15:45 |
Как я понял память освобождается после того, как были обработаны все события. И если выполнить тот код, который вы привели ниже, может произойти ошибка, из-за того, что некоторые слоты не успели отработать, а обьект уже удален. Если перевести описание данной функции, то вот, что получиться: Цитата void QObject::deleteLater () [slot] Отмечает объект для удаления. Объект будет удален когда контроль вернется к циклу обработки сообщений. Обратите внимание, что вход и выход из нового цикла обработки событий (например при открытии модального диалога) не выполнят отсроченное удаление; для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана deleteLater(). См. также destroyed() и QPointer. |
|
йцукен | Дата 28.12.2007, 15:38 |
Я так и не понял, когда происходит освобождегние памяти в вызове QObject::deleteLater? Это эдентично такому коду или нет? QObject *pObj; // ... delete pObj; pObj = 0; |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 28.4.2024, 4:35 |