README.md

    table_and_counters

    Задание

    Единственное окно приложения содержит:

    • таблицу
    • текстовый лейбл
    • кнопки:
      • Добавить - создаёт счётчик (число) со значением 0 и добавляется в таблицу
      • Удалить - удаляет из таблицы выделенный счётчик.
      • Сохранить - состояние счётчиков сохраняется в БД.

    В приложении есть отдельный поток, который обходит все счётчики от первого к последнему и увеличивает их на единицу, он работает с момента запуска до момента остановки приложения, и постоянно увеличивает значение счётчиков.

    В текстовый лейбл выводится частота инкрементировния счётчиков:

    Частота = ((sum_all_counters_in_time_t1) - (sum_all_counters_in_time_t0)) / (t1-t0).
    Время в секундах.
    

    При запуске приложение загружает данные счётчиков из БД и добавляет их в таблицу.

    В качестве БД необходимо использовать SQLite.

    Для организации многопоточности необходимо использовать библиотеку std.

    Правильное решение тестового задания подразумевает:

    1. Соответствующее описанию и исправно работающее приложение
    2. Архитектуру кода, соответствующую стандартам программирования (принципы ООП, SOLID, паттерны проектирования и т. п.)
    3. Отсутствие в коде проблем с доступом к памяти и состояния гонок
    4. Отсутствие в коде неопределённого поведения (undefined behavior) и/или готовность соискателя объяснить, что конкретное неопределённое поведение сделано в целях упрощения кода тесового здания
    5. Отсутствие в коде некорректного использования контейнеров, или готовность соискателя объяснить какие контейнеры лучше использовать в подобных решениях и что текущий выбор был сделан в целях упрощения кода тестового задания

    Зависимости

    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 в нужные методы).

    Сборка

    1. git clone https://gitflic.ru/project/testing_projects/table_and_counters.git && cd table_and_counters
    2. mkdir build && cd build
    3. cmake .. && make

    Документация

    1. Установить doxygen, doxywizard, graphviz
    2. cd doc && doxygen doxyfile.cfg
    3. firefox index.html
    Конвейеры
    0 успешных
    0 с ошибкой