Russian Qt Forum
Ноябрь 26, 2024, 04:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4] 5 6 ... 10   Вниз
  Печать  
Автор Тема: Основы удаления объектов  (Прочитано 85923 раз)
niXman
Гость
« Ответ #45 : Январь 08, 2010, 21:24 »

обдумав все, переварив, выделил два момента, которые как мне кажется, являются основными для понимания и разрешения вопроса.
1. не понимание концепции фреймворков, и непонимание концепции Qt в часности.
2. при проектировании более не менее сложного проекта, нужно сначала набросать его структуру(UML поможет). и при проектировании ОО реализации, нужно вложить в проект "здравый" смысл в плане реализации родства объектов. тут и появляется возможность полностью избавить себя от управления памятью(пул объектов + абстрактная фабрика + синглтон). но если хочется по проще, то пул объектов можно исключить.

зы
в чем изъян? Подмигивающий
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #46 : Январь 08, 2010, 21:27 »

надо было написать еще на 2й странице. Вы удаляете объект ПОСЛЕ выхода из цикла обработки событий. Как следствие никакие сигналы/слоты уже не работают. Да, объекты удаляются, да destroyed() вызывается, но никаких коннектов к нему уже нет. Потому печати и нет. Отнаследуйтесь от обектов, определите деструктор с отладочной печатью и будет вам счастье
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #47 : Январь 08, 2010, 21:33 »

могу попробовать(уже пробовал и не раз) что-то другое, алгоритмичное. просто не люблю ГУЙ писать Улыбающийся
Представьте себе - я тоже  Улыбающийся Работы с алгоритмами у меня валом. Вот только проблемы с работниками - все хотят делать UI, web и.т.п. в общем, то что выучили. а если надо думать своей головой - так сразу в кусты  Плачущий Спишемся в личке?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #48 : Январь 08, 2010, 21:34 »

а че делать надо?) а то у меня валом работы где надо учить кучу нового:( из разряда 2 недели гугла - 1 строчка решения) если алгоритмы, то это хорошо)
Записан
niXman
Гость
« Ответ #49 : Январь 08, 2010, 21:43 »

Цитировать
все хотят делать UI, web и.т.п.
это временно.
я тоже когда маленький был, хотел гуй писать. но как оказалось, это скука смертная Грустный
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #50 : Январь 08, 2010, 21:54 »

Спасибо Авварону за ответ - все правильно! Теперь другой вопрос, отображается ли освобождение памяти в виндовском диспетчере задач? Память там только увеличивается..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
niXman
Гость
« Ответ #51 : Январь 08, 2010, 21:58 »

Цитировать
отображается ли освобождение памяти в виндовском диспетчере задач?
какое отношение этот вопрос имеет к Qt?
Записан
BRE
Гость
« Ответ #52 : Январь 08, 2010, 21:58 »

Спасибо Авварону за ответ - все правильно! Теперь другой вопрос, отображается ли освобождение памяти в виндовском диспетчере задач? Память там только увеличивается..
Не мониторь память по вендовому диспетчеру, он немного другую память показывает. Память отдается и приложение может ей пользоваться.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #53 : Январь 08, 2010, 22:02 »

Цитировать
все хотят делать UI, web и.т.п.
это временно.
я тоже когда маленький был, хотел гуй писать. но как оказалось, это скука смертная Грустный
Ну почему "был"  Улыбающийся Улыбающийся
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #54 : Январь 08, 2010, 22:03 »

niXman, я не писал что этот вопрос имеет отношение к Qt..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #55 : Январь 08, 2010, 22:14 »

а че делать надо?) а то у меня валом работы где надо учить кучу нового:( из разряда 2 недели гугла - 1 строчка решения) если алгоритмы, то это хорошо)
Понимаю, но с алгоритмами никак не слаще. В чисто технических вещах - они хоть имеют конкретное решение (переписать тупой текст типа AECoerseDesc и.т.п), ладно, перетерпеть можно.  А с алгоритмами  - прочтешь пяток Phd где уверяется что, дескать, эта проблема полностью рассмотрена и решена, примешь 500-700, скажешь нехорошие слова о мамах этих теоретиков - и на следующий день по новой.
Записан
niXman
Гость
« Ответ #56 : Январь 08, 2010, 22:27 »

Цитировать
Ну почему "был"
потому что мой возраст, ну ни как не назовешь детством Подмигивающий

Цитировать
я не писал что этот вопрос имеет отношение к Qt..
а тематика сего форума, вам известна?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #57 : Январь 08, 2010, 22:35 »

Igors
ну одно дело тупо гуглить, а второе думать.
Записан
Геннадий Пастухов
Гость
« Ответ #58 : Январь 08, 2010, 22:49 »

Цитировать
все хотят делать UI, web и.т.п.
это временно.
я тоже когда маленький был, хотел гуй писать. но как оказалось, это скука смертная Грустный


Странно, как можно хотеть писать гуй Улыбающийся Это ж тоска зелёная... Когда я понял, что такое stdin и stdout - судьба гуя для меня была решена Улыбающийся
Записан
BRE
Гость
« Ответ #59 : Январь 08, 2010, 22:51 »

Вы удаляете объект ПОСЛЕ выхода из цикла обработки событий. Как следствие никакие сигналы/слоты уже не работают. Да, объекты удаляются, да destroyed() вызывается, но никаких коннектов к нему уже нет.
Уточню. Никакого значения не имеет то, что цикл обработки событий уже остановлен. Тип соединения сигналов со слотами - DirectConnection, т.е. очередь сообщения не используется. А не вызываются слоты потому, что слоты находятся в удаляемом виджете, поэтому еще до разрушения детей все сигналы с ним разрываются (disconnect).
Если сделать внешний объект, который будет следить за этими сигналами, то все будет работать:
Код
C++ (Qt)
#include <QApplication>          
#include <QLabel>                
#include <QDebug>                
 
class Logger : public QObject
{                            
       Q_OBJECT            
 
public slots:
       void    dead( QObject *obj )
       {
               qDebug() << "Dead object" << obj;
       }
};
 
class TestWidget : public QWidget
{
       Q_OBJECT
public:
       TestWidget( Logger *log ) : QWidget( 0 )
       {
               QLabel *lbl1 = new QLabel( this );
               QLabel *lbl2 = new QLabel( this );
 
               connect( lbl1, SIGNAL( destroyed( QObject * ) ), log, SLOT( dead( QObject * ) ) );
               connect( lbl2, SIGNAL( destroyed( QObject * ) ), log, SLOT( dead( QObject * ) ) );
       }
};
 
int main( int argc, char *argv[] )
{
       QApplication app( argc, argv );
 
       Logger log;
 
       TestWidget *w = new TestWidget( &log );
       w->show();
       app.exec();
       delete w;
 
       return 0;
}
 
#include "main.moc"
 
Записан
Страниц: 1 2 3 [4] 5 6 ... 10   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 23.