crossplatform.ru

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


  Ответ в QObject::deleteLater
Введите ваше имя
Подтвердите код

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

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


Последние 10 сообщений [ в обратном порядке ]
SABROG Дата 3.1.2009, 21:12
 
Цитата(bobdva @ 2.1.2009, 19:57) *
что сие значит
Цитата(ViGOur @ 28.12.2007, 16:45) *
для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана deleteLater().


т.е что как на деле это происходит ?


Для многопоточных приложений. Есть гуишный QEventLoop, у каждого нового потока свой QEventLoop. Если где-то в потоке зациклить через while(1) код, то возвращение в eventloop никогда не вернется и объект через deleteLater удален не будет.

Т.ч. на деле это обычно выглядит так:
- жмешь кнопку
- приходит сигнал clicked()
- вызывается слот on_button_clicked()
- в слоте вызывается deleteLater()
- происходит выход из слота
- возвращение в код, где был emit сигнала clicked()
- возвращение в главный eventloop
- удаление объекта
bobdva Дата 2.1.2009, 19:57
  что сие значит
Цитата(ViGOur @ 28.12.2007, 16:45) *
для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана 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;
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.4.2024, 4:35