10696
|
Qt / Общие вопросы / Re: Основы удаление объектов.
|
: Январь 09, 2010, 18:04
|
Попробую отрезюмировать. На основании стандарта C++ и собственного опыта разработки я могу заключить следующее: количество new/delete в коде никак друг с другом не соотносятся. Вот пример с несколькими delete и одним new:
Реализация как в примере - конечно плохо. Но никто не мешает сделать QList для хранения A и освободить class B от всех забот по созданию/удалению экземпляров A (эта ф-циональность класса B совершенно неестественна). Я согласен с Вами что 2 и более delete (для того же объекта) = верная примета что спроектировано плохо. Но считать число delete как "показатель качества программы" - это уж чересчур, мне кажется тут Вы перегибаете палку.
|
|
|
10697
|
Qt / 2D и 3D графика / Re: Тормоза в polyline
|
: Январь 09, 2010, 14:50
|
Под анализом polyline понимается что-нибудь вроде "Polyline simplification using Douglas-Peucker algorithm"?
Нет, то другая песня, упрощать полилинию команды не было. Я имел ввиду: по своей природе AA "не любит" большие области. Поэтому если Вы будете использовать тот же drawPolyline, но рисовать, напр. по 5 точек - я предполагаю скорость будет приемлемой. Но тут есть одно "но" - нужно аккуратно "разрезать на порционные куски". Если просто "рисовать по N точек", то картинка может "интерферировать" - в одних местах график будет выглядеть ярче, в др. бледнее. Нужно ставить места разрывов там где наклон достаточно мал. Конечно, это экспериментальная идея, сам не проверял
|
|
|
10698
|
Qt / Общие вопросы / Re: Основы удаление объектов.
|
: Январь 09, 2010, 13:57
|
Все children'ы удаляются автоматычно, все корректно. Да, destroyed в данном случае не приходит потому что, как указал BRE, коннект уже разорван. А разорвать его было необходимо потому что widget уже разрушен (как указал Dendy). Поставьте слот на что-нибудь живущее - и destroyed будет приходить. А убедиться удаляются ли children'ы проще не связываясь с destroyed а напр. так class MyLabel : public QLabel { public: MyLabel( const QString & txt, QWidget * parent = 0 ) : QLabel(txt, parent) {} ~MyLabel( void ) { qDebug() << "MyLabel destroyed"; } };
Edit: перечитав, вижу что Авварон уже ответил - но разве в такой свалке что-то разберешь?
|
|
|
10699
|
Qt / Общие вопросы / Re: Основы удаление объектов.
|
: Январь 08, 2010, 22:14
|
а че делать надо?) а то у меня валом работы где надо учить кучу нового:( из разряда 2 недели гугла - 1 строчка решения) если алгоритмы, то это хорошо)
Понимаю, но с алгоритмами никак не слаще. В чисто технических вещах - они хоть имеют конкретное решение (переписать тупой текст типа AECoerseDesc и.т.п), ладно, перетерпеть можно. А с алгоритмами - прочтешь пяток Phd где уверяется что, дескать, эта проблема полностью рассмотрена и решена, примешь 500-700, скажешь нехорошие слова о мамах этих теоретиков - и на следующий день по новой.
|
|
|
10700
|
Qt / Общие вопросы / Re: Основы удаление объектов.
|
: Январь 08, 2010, 22:02
|
все хотят делать UI, web и.т.п. это временно. я тоже когда маленький был, хотел гуй писать. но как оказалось, это скука смертная Ну почему "был"
|
|
|
10701
|
Qt / 2D и 3D графика / Re: Тормоза в polyline
|
: Январь 08, 2010, 21:56
|
Пробовал QPainterPath - мертвому припарки - 1 fps. А вот заменил по совету Igors каждый из вызовов drawPolyline на цикл c drawLine - 30 (!!!) fps. Картинка, правда несколько изменилась, но несущественно. Что же там такого страшного в drawPolyline делается?
Много чего По своей работе мне AA заниматься приходится. Есть методы AA (adaptive (частный случай average), oversampling - техники смешивания суб-пикселей), есть базовые параметры - в общем это бандура солидная и падение скорости в 20-30 раз не есть багво (хотя конечно это слабо). Но я совершенно ничего не знаю что имеется ввиду "Qt AA" - и вводить в заблуждение не могу (может это совсем другое). Для Вашего графика (конкретный/частный случай) возможно не менее 20 fps без видимого падения квачества (добавить простой анализ polyline)
|
|
|
10702
|
Qt / Общие вопросы / Re: Основы удаление объектов.
|
: Январь 08, 2010, 21:33
|
могу попробовать(уже пробовал и не раз) что-то другое, алгоритмичное. просто не люблю ГУЙ писать Представьте себе - я тоже Работы с алгоритмами у меня валом. Вот только проблемы с работниками - все хотят делать UI, web и.т.п. в общем, то что выучили. а если надо думать своей головой - так сразу в кусты Спишемся в личке?
|
|
|
10703
|
Qt / Общие вопросы / Re: Основы удаление объектов.
|
: Январь 08, 2010, 21:15
|
В деструктор widget добавляем, например delete text; и на консоль выводится нужное "Crashed number 0".. Господа, что же это значит? Я так понимаю, что не стоит надеяться на фрэймворк и явно вызывать delete, как это принято в стандарте C++..есть другие мнения?
Это не тот вопрос который решается мнением/голосованием Выложите пожалуйста компилябельный проект, попробуем разобраться. Все children должны быть удалены parent'ом, Qt это гарантирует. Нельзя удалять что уже удалено
|
|
|
10704
|
Qt / Общие вопросы / Re: Основы удаление объектов.
|
: Январь 08, 2010, 20:39
|
детский сад, честное слово...
ilot, именно вам я давал ссылки по теме. повторю: ... так же по теме, что будет как минимум полезно, еще это порекомендую: ... а еще лучше, прочесть всю тему: ...
niXman. я против Вас ничего не имею, но мне кажется, что детский сад - это те ссылки которые Вы даете Да, слова там везде хорошие и правильные и они от реальной практики. Только вот применимо это все в одном случае - "за спиной" мощного инструментария (типа Qt) который делает 80% того что требуется. Вот тогда очень хорошо/удобно покалякать о "концепциях", "сущностях" и.т.п. Но все это проходит "как с белых яблонь дым" как только выйти за рамки стандартных задач. Попробуйте напр. написать просто ListBox "с нуля", т.е. используя только ф-ции рисования и базовые events (мне приходилось и не потому что хотел) - и уверяю Вас, от книжной идейности останутся "рожки да ножки". И Вам уже будет не до менторского "порекомендую" - а чтобы оно "абы как но работало". ilot и Геннадий правильно поясняют что есть "основы" которыми нужно владеть в полной мере. А нахвататься умных классов библиотеки - там и помогать не надо
|
|
|
10706
|
Qt / Общие вопросы / Re: Основы удаление объектов.
|
: Январь 08, 2010, 15:46
|
>>И согласен с Геннадием что delete должно делаться программистом "рефлекторно" на каждое new. этот рефлекс может породить проблемы в Qt, при работе с наследниками QObject.
Есть правила, есть исключения. Но исключения не значат что можно обойтись без правил.
|
|
|
10707
|
Qt / Общие вопросы / Re: Основы удаление объектов.
|
: Январь 08, 2010, 14:48
|
Геннадий Пастухов, такое ощущение, что вы пришли из мира C, для него ваши замечания справедливы (с единственной поправкой на auto_ptr). Для C++ же существуют виртуальные деструкторы и множество вариантов шаблонов, позволяющие на N вызовов new в разных кусках кода иметь всего один delete. Про самодеятельность - это вы мимо. Степень потенциальных ошибок в C++ как раз пропорциональна количеству явных вызовов delete в коде.
Я не считаю С "дурным тоном". И, конечно, контейнеры, шаблоны - дело великое и экономят массу времени. Но они тоже не идеальны. Например QList <int> lst; for (int i = 0; i < 1024 * 1024; ++i) lst.append(i); ... lst.clear(); // это не освободит память
Так что иной раз и незатейливое new лучше. И согласен с Геннадием что delete должно делаться учитываться программистом "рефлекторно" на каждое new. И лучше освоить это твердо до прикручивания высокоуровневых классов а то "каша" получится.
|
|
|
10708
|
Qt / Общие вопросы / Re: Как средствами Qt узнать инфу о свободной памяти?
|
: Январь 07, 2010, 13:08
|
В моем случае массив может иметь около 250 млн. байтовых элементов, это изрядно для не самой мощной машинки с 512 Мб оперативки.
Неясно кто такие "байтовые элементы" - просто байты? Есть ли у считываемых данных конструктор/деструктор, виртуальные методы и т. п? Если да - то Ваше решение использовать QList правильно. Если нет (пассивные данные, байты информации) то гораздо лучше использовать просто new или QVector (если требуется вставка/удаление). Если б я юзал new... Массив считывается с файла, точное значение элементов заранее неизвестно (можно конечно предварительно просканировать файл и посчитать их, но это лишнее время). Поэтому юзаю QList с его append-ом.
На таких данных append съест гораздо больше времени и памяти чем предварительный проход. Вопрос - ОС подгрузила на swap что-то свое или мой массив? И прокатит тот же фокус в винде?
При объеме 250 Мб - да, прокатит, и на Mac OSX тоже. Все OS в этом смысле примерно одинаковы. Везде память виртуальна, есть swap на диск и отключить это нельзя. Везде любому процессу выделяется адресное пространство 2 Gb (а кое-где и больше) в 32-bits. (поэтому кол-во свободной оперативки ни о чем не говорит). Однако не все OS могут выделять непрерывные блоки больше 1 Gb (даже если столько памяти есть физически). Поэтому выбирать контейнер для больших данных нужно очень тщательно.
|
|
|
10709
|
Qt / Пользовательский интерфейс (GUI) / Re: Виджет верхнего уровня.
|
: Январь 06, 2010, 20:45
|
Здравствуйте! У меня есть главное диалоговое окно. На нем разбросаны куча виджетов. Я хочу по нажатию кнопки чтобы один виджет растягивался на все диалоговое окно. И было только этот один виджет виден, а остальные спрятались. На деле, когда я запускаю программу и расстягиваю один виджет на все диалоговое окно, то остальные виджеты не прячутся, а рисуются поверх моего виджета. Даже если я для них делаю ->hide(), то они все равно появляются поверх. Как сделать свой виджет, чтобы он рисовался поверх всех остальный виджетов? Чтобы остальные прятались за ним? Укажите, пожалуйста, где копать.
Если Вы хотите по нажатию кнопки "что-то убрать а что-то показать/растянуть", то прямой путь использовать QStackedLayout/QStackedWidget. Использовать hide() тоже можно но более хлопотно и оно должно быть вызвано ДО растяжки.
|
|
|
10710
|
Qt / Общие вопросы / Re: Как средствами Qt узнать инфу о свободной памяти?
|
: Январь 06, 2010, 20:32
|
Вот только в исходниках Qt еще используются прямые вызовы malloc() и GlobalAlloc() (WINAPI).
Да, но такие вызовы используются для "личных целей Qt" например таких как рисование имеджа и.т.п. Это распределения временные, их пользовательской программе отслеживать и не нужно. Все остальное проходит через new или qMalloc - и может учитываться. Другое дело что забот с этим хватает, поэтому нужны серьезные основания начинать эту песню. К слову сказать - ведь new может и не выделять память (малоизвестная но очень полезная возможность)
|
|
|
|
|