/qmlcalc

Primary LanguageC++

Комментарии:

  1. При разработке тестового задания приоритет отдавался классам Qt, вместо native c++;
  2. Если я правильно понял, то второй поток - это main thread, поэтому дополнительно создаётся только один поток;
  3. Для взаимодействия с потоком расчёта использовались две структуры Request и Responce. На первый взгляд некоторые поля этих структур являются избыточнымы. Избыточность добавлялась для читаемости вывода в панель консоли;
  4. Сформированный запрос в потоке расчёта сначала переводится в постфиксную запись, после рассчитывается;

Тестовое задание:

I. Программа калькулятор на Qt.

Аналог калькулятора Windows (вид простой, не научный) Операции калькулятора: сложение, вычитание, деление, умножение.

Все операции вычисления выполняются посредством вызова функции из ВНЕШНЕЙ DLL, написанной на С++ в любой среде разработки. Прототип этой функции: double DoIt (int TypeWork, double OperandA, double OperandB, int* ErrorCode) TypeWork - Тип операции (+,-,/,*)

Ввести 2 потокобезопасных очереди. QueueRequests и QueueResults В первую складываются запросы на вычисления. Во вторую результаты вычислений. Размер очередей отображать на интерфейсе

Операция вычисления выполняется в ОТДЕЛЬНОМ ПОТОКЕ. Каждое вычисление длится определенное время, которое можно задать в секундах с интерфейса. Это нужно для симуляции длительных вычислений и накопления очереди запросов. Принцип такой: Поток 1

  1. по прошествии времени предыдущего вычисления из QueueRequests берется следующий элемент (если он там есть).
  2. Извлеченный элемент отправляется на обработку.
  3. Ожидание окончания вычисления и укладка в QueueResults.
  4. далее по кругу. Поток 2 Формирует новые запросы в очередь запросов (QueueRequests) Выводит результаты изх очередеи результатов (QueueResults)

Для вывода запросов на вычисление, результатов вычислений, ошибок использовать некую консоль, желательно с цветным текстом Запросы - зеленые, результаты - синие, ошибки - красные

Каждое нажатие "=" приводит к складыванию в очередь запросов текущего введенного запроса на вычисление, если оно существует конечно :) иначе ошибку в консоль.

Интерфейс делается по вкусу, без нелепостей и лишних галочек. Красота и эргономичность приветствуется. При выходе программа сохраняет свои размеры и положение. При запуске восстанавливает свои размеры и положение, если есть из чего восстанавливать.

Важно: При разработке пользовательского интерфейса использовать QML Обработка всех ошибок: Ошибки ввода. Многократное нажатие кнопок (типа тупое тыркание). Ошибки вычисления (их не так уж и много, например деление на 0). Вывод ошибок НЕ осуществлять через МessageBox. Очень раздражает обычных пользователей.