table_and_counters
Задание
Единственное окно приложения содержит:
- таблицу
- текстовый лейбл
- кнопки:
- Добавить - создаёт счётчик (число) со значением 0 и добавляется в таблицу
- Удалить - удаляет из таблицы выделенный счётчик.
- Сохранить - состояние счётчиков сохраняется в БД.
В приложении есть отдельный поток, который обходит все счётчики от первого к последнему и увеличивает их на единицу, он работает с момента запуска до момента остановки приложения, и постоянно увеличивает значение счётчиков.
В текстовый лейбл выводится частота инкрементировния счётчиков:
Частота = ((sum_all_counters_in_time_t1) - (sum_all_counters_in_time_t0)) / (t1-t0).
Время в секундах.
При запуске приложение загружает данные счётчиков из БД и добавляет их в таблицу.
В качестве БД необходимо использовать SQLite.
Для организации многопоточности необходимо использовать библиотеку std.
Правильное решение тестового задания подразумевает:
- Соответствующее описанию и исправно работающее приложение
- Архитектуру кода, соответствующую стандартам программирования (принципы ООП, SOLID, паттерны проектирования и т. п.)
- Отсутствие в коде проблем с доступом к памяти и состояния гонок
- Отсутствие в коде неопределённого поведения (undefined behavior) и/или готовность соискателя объяснить, что конкретное неопределённое поведение сделано в целях упрощения кода тесового здания
- Отсутствие в коде некорректного использования контейнеров, или готовность соискателя объяснить какие контейнеры лучше использовать в подобных решениях и что текущий выбор был сделан в целях упрощения кода тестового задания
Зависимости
Qt6
- интерфейст приложения
fmt
- форматирование лога в консоли
sqlite3
- работа с БД
Описание
Программа написана в соответствии с заданием и работает следующим обрзом:
В конструкторе MainWindow создаётся gui программы, а также все служебные классы, отвечающие за данные и их обработку:
TableModel_t - предоставляет данные для таблицы, а также является определённой прослойкой для работы с БД, работа с которой организована через класс SQLite3_t.
IncCounters_t - потоковый класс инкремента счётчиков, сигналы из которого sigDataChanged и sigFreqChanged соеденены как с gui программы (класс MainWindow) так и с моделью для таблицы (класс TableModel_t) для отображения данных в QTableView в gui.
Data_t - класс с данными счётчиков и методы работы с ними. Данный класс позволяет работать с данными через блокировку mutex-а в разных потоках избегая состояния гонки потоков. (В будущем unique_lock можно заменить на spin_lock (для увеличения производительности), а также внести shared_lock в нужные методы).
Сборка
- git clone https://gitflic.ru/project/testing_projects/table_and_counters.git && cd table_and_counters
- mkdir build && cd build
- cmake .. && make
Документация
- Установить
doxygen
,doxywizard
,graphviz
- cd doc && doxygen doxyfile.cfg
- firefox index.html