Russian Qt Forum

Qt => Вопросы новичков => Тема начата: bronstein87 от Май 16, 2017, 14:23



Название: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: bronstein87 от Май 16, 2017, 14:23
Здравствуйте. Мне необходимо собрать Qt с отключенным QT_NO_EXCEPTION, чтобы исключения генерировались в классах Qt. Подскажите, как осуществить пересборку?
ОС: Win7, компилятор mingw-32


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: qate от Май 16, 2017, 15:32
а что этим будет достигнуто ?


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: bronstein87 от Май 16, 2017, 15:47
а что этим будет достигнуто ?

Код:
767 #ifdef QT_NO_EXCEPTIONS
768 #  if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
769 #    define Q_CHECK_PTR(p) qt_noop()
770 #  else
771 #    define Q_CHECK_PTR(p) do {if(!(p))qt_check_pointer(__FILE__,__LINE__);} while (0)
772 #  endif
773 #else
774 #  define Q_CHECK_PTR(p) do { if (!(p)) qBadAlloc(); } while (0)
775 #endif

Q_CHECK_PTR будет пробрасывать bad_alloc, а не вызывать версию с qt_check_pointer, которая вызывает qFatal() и абортит программу. В общем, внутри классов Qt где реализована возможность проброса исключения - это будет сделано.


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: qate от Май 16, 2017, 16:19
и часто именно qt классы абортят программу ?
у меня обычно этот делает мой код )
всеже не пойму выгоды исключений тут, рабочие примеры есть ?


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: bronstein87 от Май 16, 2017, 16:39
и часто именно qt классы абортят программу ?
у меня обычно этот делает мой код )
всеже не пойму выгоды исключений тут, рабочие примеры есть ?
Моя программа строит большое количество графиков (QChart) по большим объемам данных.
При передаче chart-а на ChartView с помощью setChart() происходят аллокации векторов в больших объемах (краем глаза глядет исходники, в суть не вникал),
в случае нехватки памяти программа абортится, что никак меня не устраивает. Я хочу реализовать поведение через исключения, заключающееся в том, что при нехватке памяти Q_CHECK_PTR бросит bad_alloc, а в catch() я просто очищу часть памяти, что позволит программе продолжить работу а уже построенным графикам жить, а не завершится через abort().


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: kuzulis от Май 16, 2017, 16:58
Цитировать
Моя программа строит большое количество графиков (QChart) по большим объемам данных.

Используйте Qwt вместо этого тормознутого QChart и будет все хорошо.


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: bronstein87 от Май 16, 2017, 17:18
Цитировать
Моя программа строит большое количество графиков (QChart) по большим объемам данных.

Используйте Qwt вместо этого тормознутого QChart и будет все хорошо.

Возможно, вы правы. Но уже очень много написано с использованием QChart, так что сейчас это не вариант. Вы можете подсказать что-нибудь по вопросу в названии темы?
И еще вопрос, в чем по-вашему заключается его тормознутость ? Сейчас сижу на версии 5.9, вроде работает вполне прилично.


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: kuzulis от Май 16, 2017, 18:25
Цитировать
Вы можете подсказать что-нибудь по вопросу в названии темы?

Нет, ничего нового не скажу.

Цитировать
И еще вопрос, в чем по-вашему заключается его тормознутость ?

А сравните-ка потребление памяти, потребление CPU при отрисовке, да и вообще, анимации.

Из личного опыта - если нужно использовать прокрутку, зум, и что-то наподобие графиков реального времени
(когда новые данные отображаются по мере их поступления и шкала времени сдвигается), то QtCharts ооочень сильно
проседает и вообще ведет себя неадекватно (например, рисует всякую ересь или вообще перестает отрисовывать
данные в надлежащем виде).

Например, их пример "осциллограф" работает... Но, стоит немного модифицировать его так, чтобы шкала времени-X
менялась, то появляются проблемы. Также, в QtCharts нет возможности выбрать интересующий интервал с данными
по их значениям (например, хотим посмотреть данные с 10-й по 11-ю секунды), там есть только что-то наподобие
скроллинга, где выбирается "на сколько пикселей" прокрутить влево, вправо, вверх или вниз.. бррр..

Я недавно с дуру тоже было взял QtCharts (дай, думаю попробую, вроде-ж он был коммерческий, значит проверенный
и шустрый, думал я). и тут хрясь -такой облом... жрет памяти немерено, жрет CPU (~20-30% чтобы перерисовать 200
точечек каждые ~50 мсек). И при том, имеется утечка памяти, при которой, оно выедает всю RAM со временем.
Ай яй яй, думаю, что-же я наделал!!! :) А проект то вот вот уже надо здавать!!!

В итоге плюнул и переписал все на Qwt, все шустро, загрузка ~1-2%, жрет ~5Mb и доволен как слон (жаль что нет
биндингов для QML)..

PS: Вот такая история.. лично я бы не советовал QtCharts, по крайней мере для отображения большого кол-ва
динамических данных.. оно совершенно не подходит для этого, ИМХО (какашка в красивой обертке).

PS: Так что не факт, что с устранением QT_NO_EXCEPTIONS будет лучше... это все борьба со следствием проблемы,
а не с ее причиной. ;)


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: qate от Май 16, 2017, 18:41
в случае нехватки памяти программа абортится, что никак меня не устраивает.

а что делать если памяти нет, просить пользователя сбегать в магазин ? )
или ждать пока освободится ?
свопа тоже нет ?


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: bronstein87 от Май 17, 2017, 19:47
в случае нехватки памяти программа абортится, что никак меня не устраивает.

а что делать если памяти нет, просить пользователя сбегать в магазин ? )
или ждать пока освободится ?
свопа тоже нет ?

Если памяти нет, пусть строит графики по меньшим интервалам.


Название: Re: пересобрать QT с конфигурацией -UQT_NO_EXCEPTIONS
Отправлено: qate от Май 18, 2017, 08:53
Если памяти нет, пусть строит графики по меньшим интервалам.

это если программа на это расчитана

я вообще не знаю как корректно отрабатывать нехватку памяти
это может случиться в любом месте, все не предусмотреть, пока считаю лучше упасть с коркой