Сначала полистал кутишные примеры — ничего полезного не нашел. Вообще, по примерам сложилось впечатление, что Qt — это куча каких мало кому нужных свистоперделок. Ну ладно, это лирика.
Вообще, у меня есть несколько задач по графикам из разных областей, местами не связанных.
1) Нужен временной график функции, данные приходят от железа. Просто отображать, ничего особенного. Но хочется, чтобы хранением данных, прокруткой и тп заведовало Qt, чтобы самому писать по минимуму.
2) Хочу рисовать биржевые свечки
3) Хочу рисовать биржевые свечки, и поверх них — свои графики
Полистал тут интернеты — ситуация не самая радужная. Есть вроде QtCharts, но он платный, чего хотелось бы избежать.
Из бесплатного что нашел — сторонний QCustomPlot — вроде то, что нужно для моего п. 1
Для п. 2 вроде бы подходит искаробочный Graphics View Framework — сделать свой класс, который отображает элемент, и добавляй себе. Вроде ничего.
А вот для п. 3 — не совсем понятно, получится ли рисовать поверх свечек свои графики.
Здравствуйте, Marty, Вы писали:
M>Вообще, у меня есть несколько задач по графикам из разных областей, местами не связанных.
M>1) Нужен временной график функции, данные приходят от железа. Просто отображать, ничего особенного. Но хочется, чтобы хранением данных, прокруткой и тп заведовало Qt, чтобы самому писать по минимуму. M>2) Хочу рисовать биржевые свечки M>3) Хочу рисовать биржевые свечки, и поверх них — свои графики
M>Полистал тут интернеты — ситуация не самая радужная. Есть вроде QtCharts, но он платный, чего хотелось бы избежать. M>Из бесплатного что нашел — сторонний QCustomPlot — вроде то, что нужно для моего п. 1 M>Для п. 2 вроде бы подходит искаробочный Graphics View Framework — сделать свой класс, который отображает элемент, и добавляй себе. Вроде ничего. M>А вот для п. 3 — не совсем понятно, получится ли рисовать поверх свечек свои графики.
M>Что ещё посоветуете? https://qwt.sourceforge.io/
Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>Сначала полистал кутишные примеры — ничего полезного не нашел. Вообще, по примерам сложилось впечатление, что Qt — это куча каких мало кому нужных свистоперделок. Ну ладно, это лирика.
M>Вообще, у меня есть несколько задач по графикам из разных областей, местами не связанных.
M>1) Нужен временной график функции, данные приходят от железа. Просто отображать, ничего особенного. Но хочется, чтобы хранением данных, прокруткой и тп заведовало Qt, чтобы самому писать по минимуму.
Здравствуйте, Marty, Вы писали: M>Полистал тут интернеты — ситуация не самая радужная. Есть вроде QtCharts, но он платный, чего хотелось бы избежать.
Использую. Работает нормально, но руками приходится писать даже для довольно простого случая
1) QWT показалась мне более богатой на возможности, поэтому решил использовать её
У нас нет строгой установки если какие-то мелкие утилиты для компа пишутся — MSVC 17/19, MinGW 7.3/8.1Ну, и соответственно, если либы (обычно свои, правда) обычно подо всё это собираются.
В общем, разобрался я, как QWT собрать под все варианты, собрал. Полная сборка с release/debug — больше полудня заняла.
Собрал сэмплы, посмотрел что как работает.
Стал вкорячивать в свою прогу — содрал с примера один к одному — падает. По шагам в вижуалке не пройти — F11 — и падает, а в метод QWTшный не заходит. Всё вроде корректно на входе, и хз почему падает и не ходит по шагам. Что-то грусть-тоска взяла.
Глупо потратил время на сборку
UPD Батники для сборки QWT залил на гитхаб — https://github.com/al-martyn1/qwt_windows_build_scripts
Там же можно скачать архив с собранными вариантами QWT и сэмплами (сэмплы собраны только под MinGW 7.3) и батником для деплоя qwt_windeploy.bat (при сборке он генерится с тем путём, который задан как выходной каталог, а готовый из архива надо поправить, прописав путь, куда разархивирована QWT).
Есть описание на корявом инглише
2) Попробовал QCustomPlot
Почему сразу с него не начал — показался каким-то несерьёзным на первый взгляд, всего два файла, cpp/h. Оказалось, что это было глупо — два файла там просто потому, что их сделали амальгамэшином.
А вообще — по возможностям плюс минус не сильно хуже QWT. В QWT там конечно есть некоторые красивые контролы, но, в принципе, никто не мешает использовать и то и другое.
Большой плюс — собирается быстро, и нормально можно по нутряшкам подебажить. Ну и заработало сразу
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, Marty, Вы писали:
M>Докладываю:
M>1) QWT показалась мне более богатой на возможности, поэтому решил использовать её
+100500
Это отличная библиотека. Мы её используем (применяем под Linux Ubuntu). В Windows под MSVC — Qwt не применял.
M>Стал вкорячивать в свою прогу — содрал с примера один к одному — падает. По шагам в вижуалке не пройти — F11 — и падает...
И под MSVC, и под MinGW одинаково падает?
В таких случаях, откладываю в сторону дебаггер и отлаживаюсь логированием. Т.е. через лог-файл.
Вот что применяю для этого: https://github.com/gabime/spdlog
M>2) Попробовал QCustomPlot...
M>>Стал вкорячивать в свою прогу — содрал с примера один к одному — падает. По шагам в вижуалке не пройти — F11 — и падает...
AG>В таких случаях, откладываю в сторону дебаггер и отлаживаюсь логированием. Т.е. через лог-файл. AG>Вот что применяю для этого: AG>https://github.com/gabime/spdlog
А я не понял вообще, как это происходило — создавался виджет, вызывались методы. Потом доходило до вызова какого-то метода вроде даже без параметров, и бац — аксес виолейшн. Их хз что там за адрес, откуда он взялся. Какими логами ты такое отловишь?
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, AlexGin, Вы писали:
M>>>Стал вкорячивать в свою прогу — содрал с примера один к одному — падает. По шагам в вижуалке не пройти — F11 — и падает...
AG>>В таких случаях, откладываю в сторону дебаггер и отлаживаюсь логированием. Т.е. через лог-файл. AG>>Вот что применяю для этого: AG>>https://github.com/gabime/spdlog
M>А я не понял вообще, как это происходило — создавался виджет, вызывались методы. Потом доходило до вызова какого-то метода вроде даже без параметров, и бац — аксес виолейшн. Их хз что там за адрес, откуда он взялся. Какими логами ты такое отловишь?
1) Собрать минимальный вариант данного примера (может быть — падает из-за особенностей Вашего приложения, или даже ошибок в нём).
2) Проверить на MinGW — есть ли такой же самый эффект (я так понял, что падало при сборке под MSVC).
3) Да, крайний случай через логирование. Выводим в лог-файл значение переменных (например — указатель, чтобы знать что он НЕ нулевой).
Здравствуйте, AlexGin, Вы писали:
M>>А я не понял вообще, как это происходило — создавался виджет, вызывались методы. Потом доходило до вызова какого-то метода вроде даже без параметров, и бац — аксес виолейшн. Их хз что там за адрес, откуда он взялся. Какими логами ты такое отловишь?
AG>1) Собрать минимальный вариант данного примера (может быть — падает из-за особенностей Вашего приложения, или даже ошибок в нём).
Ну это не про логи. Мне лень было делать МВП, поэтому я свалил на QCustomPlot
Несомненно, проблема была в моём приложении. Только я не понял, где
Тут подумалось, что проблема могла быть в том, что я собрал DLLку как-то не так. Хотя, примеры из QWT я с ней собрал, и они работают. Если есть желание/настроение, можешь попробовать мою сборку и глянуть мои батники для сборки
AG>2) Проверить на MinGW — есть ли такой же самый эффект (я так понял, что падало при сборке под MSVC).
Был и на MinGW
AG>3) Да, крайний случай через логирование. Выводим в лог-файл значение переменных (например — указатель, чтобы знать что он НЕ нулевой).
Смысл? До вызова метода я нормально ставил бряк и в отладчике все указатели и пр внимательно проверял. И вот только что вышли из метода объекта, стою на строчке вызова другого метода — F11 — крэш не пойми где с обращением по какому-то непонятному адресу
Здравствуйте, Marty, Вы писали:
M>Ну это не про логи. Мне лень было делать МВП, поэтому я свалил на QCustomPlot M>Несомненно, проблема была в моём приложении. Только я не понял, где
Я бы — попробовал разобраться в чём проблема. Обычно потом вылезает в самый неподходящий момент.
При этом, совсем не обязательно отказаться от применения QCustomPlot.
Просто определиться, что именно мешало применению Qwt.
M>Тут подумалось, что проблема могла быть в том, что я собрал DLLку как-то не так. Хотя, примеры из QWT я с ней собрал, и они работают. Если есть желание/настроение, можешь попробовать мою сборку и глянуть мои батники для сборки.
Хорошо, сбрось исходники и всё остальное (лучше — ссылочку на GitHub).
Попробую хоть чем-то помочь.
Сбрось на почту:
alexgin1965@gmail.com или же: alexgin1965@mail.ru
AG>>3) Да, крайний случай через логирование. Выводим в лог-файл значение переменных (например — указатель, чтобы знать что он НЕ нулевой).
M>Смысл? До вызова метода я нормально ставил бряк и в отладчике все указатели и пр внимательно проверял.
На выделенное выше ты тратил огромное время (с точки зрения программного процесса).
Уточню — время основного, или как ещё называют интерфейсного потока выполнения — aka main-thread.
А что же в это время делел, например рабочий поток (aka worker-thread), о котором ты забыл во время отладки?
Может этот worker-thread, не найдя свежих данных (из-за задержки main-thread), грохнулся об nullptr?
В наших разработках — такое, ну или что-то подобное бывает нередко.
Вот тут на помощь приходит отладка логированием, тот же spdlog.
Тогда, логируюя переменные головного (main-thread) и вспомогательного (worker-thread) потоков,
выясняем эту проблему и, например, чиним синхронизацию потоков, чтобы worker-thread коррктно ждал.
Ну или что-либо другое, в зависимости от причины.
Здравствуйте, AlexGin, Вы писали:
AG>Я бы — попробовал разобраться в чём проблема. Обычно потом вылезает в самый неподходящий момент. AG>При этом, совсем не обязательно отказаться от применения QCustomPlot. AG>Просто определиться, что именно мешало применению Qwt.
Мне было лень, и я отказался от QWT
M>>Тут подумалось, что проблема могла быть в том, что я собрал DLLку как-то не так. Хотя, примеры из QWT я с ней собрал, и они работают. Если есть желание/настроение, можешь попробовать мою сборку и глянуть мои батники для сборки. AG> AG>Хорошо, сбрось исходники и всё остальное (лучше — ссылочку на GitHub). AG>Попробую хоть чем-то помочь.
Или ты прям не прочь в самих моих сорцах поковыряться? Вечерком скину, ок
M>>Смысл? До вызова метода я нормально ставил бряк и в отладчике все указатели и пр внимательно проверял. AG> AG>На выделенное выше ты тратил огромное время (с точки зрения программного процесса). AG>Уточню — время основного, или как ещё называют интерфейсного потока выполнения — aka main-thread. AG>А что же в это время делел, например рабочий поток (aka worker-thread), о котором ты забыл во время отладки? AG>Может этот worker-thread, не найдя свежих данных (из-за задержки main-thread), грохнулся об nullptr?
Вообще я сам никаких потоков не создавал. А если Qt само там что-то создало, то как мне до туда добраться и что мне там делать?
AG>В наших разработках — такое, ну или что-то подобное бывает нередко. AG>Вот тут на помощь приходит отладка логированием, тот же spdlog.
AG>Тогда, логируюя переменные головного (main-thread) и вспомогательного (worker-thread) потоков, AG>выясняем эту проблему и, например, чиним синхронизацию потоков, чтобы worker-thread коррктно ждал.
Ну нету у меня никаких воркер тредов.
И логгированием я нормально умею отлаживаться, на STM32 это основной способ. Только тут
Здравствуйте, Marty, Вы писали:
M>Мне было лень, и я отказался от QWT
M>Или ты прям не прочь в самих моих сорцах поковыряться? Вечерком скину, ок
Скорее всего — сильно ковыряться не буду. Но иногда — свежий взгляд помогает.
M>Вообще я сам никаких потоков не создавал. А если Qt само там что-то создало, то как мне до туда добраться и что мне там делать?
Пример с multi-threading я выбрал, как один из ярких примеров, когда удобна отладка логами.
Понятно, что этот пример совсем не единственный.
M>Ну нету у меня никаких воркер тредов.
Так тогда тем более интересно разобраться!
Почему же падаем? В чём причина проблемы?
Попутно замечу, что лично мне нравиться решать такие вот софтверные головоломки
M>И логгированием я нормально умею отлаживаться, на STM32 это основной способ.
+100500
Совершенно верно!
Когда отлаживаем ПО для устройства — это также весьма актуально.