Комментарии:
- При разработке тестового задания приоритет отдавался классам Qt, вместо native c++;
- Если я правильно понял, то второй поток - это main thread, поэтому дополнительно создаётся только один поток;
- Для взаимодействия с потоком расчёта использовались две структуры Request и Responce. На первый взгляд некоторые поля этих структур являются избыточнымы. Избыточность добавлялась для читаемости вывода в панель консоли;
- Сформированный запрос в потоке расчёта сначала переводится в постфиксную запись, после рассчитывается;
Тестовое задание:
I. Программа калькулятор на Qt.
Аналог калькулятора Windows (вид простой, не научный) Операции калькулятора: сложение, вычитание, деление, умножение.
Все операции вычисления выполняются посредством вызова функции из ВНЕШНЕЙ DLL, написанной на С++ в любой среде разработки. Прототип этой функции: double DoIt (int TypeWork, double OperandA, double OperandB, int* ErrorCode) TypeWork - Тип операции (+,-,/,*)
Ввести 2 потокобезопасных очереди. QueueRequests и QueueResults В первую складываются запросы на вычисления. Во вторую результаты вычислений. Размер очередей отображать на интерфейсе
Операция вычисления выполняется в ОТДЕЛЬНОМ ПОТОКЕ. Каждое вычисление длится определенное время, которое можно задать в секундах с интерфейса. Это нужно для симуляции длительных вычислений и накопления очереди запросов. Принцип такой: Поток 1
- по прошествии времени предыдущего вычисления из QueueRequests берется следующий элемент (если он там есть).
- Извлеченный элемент отправляется на обработку.
- Ожидание окончания вычисления и укладка в QueueResults.
- далее по кругу. Поток 2 Формирует новые запросы в очередь запросов (QueueRequests) Выводит результаты изх очередеи результатов (QueueResults)
Для вывода запросов на вычисление, результатов вычислений, ошибок использовать некую консоль, желательно с цветным текстом Запросы - зеленые, результаты - синие, ошибки - красные
Каждое нажатие "=" приводит к складыванию в очередь запросов текущего введенного запроса на вычисление, если оно существует конечно :) иначе ошибку в консоль.
Интерфейс делается по вкусу, без нелепостей и лишних галочек. Красота и эргономичность приветствуется. При выходе программа сохраняет свои размеры и положение. При запуске восстанавливает свои размеры и положение, если есть из чего восстанавливать.
Важно: При разработке пользовательского интерфейса использовать QML Обработка всех ошибок: Ошибки ввода. Многократное нажатие кнопок (типа тупое тыркание). Ошибки вычисления (их не так уж и много, например деление на 0). Вывод ошибок НЕ осуществлять через МessageBox. Очень раздражает обычных пользователей.