Многопоточный калькулятор
Здравствуйте.
Задача сделать так, чтобы программа работала в двух потоках. Нужно искусственно слипать поток, дабы эмулировать долгие вычисления.
В первом: 1. Формируется запрос на вычисление и происходит добавление его в очередь потока 2 (при нажатии на кнопку = ). 2. Вывод результатов (например в qDebug), полученных из потока 2
Во втором (доступ к потоку 2 должен быть потокобезопасным): 1. Как завершится пред. вычисление, преступать к следующему поступившему из потока 1. 2. Извлеченный элемент отправляется на обработку. 3. Ожидание окончания 4. Передача результата в основной поток
С библиотекой QThread не знаком, + читал о нескольких способах реализации, так и не понял как сделать грамотнее.
- void MainWindow::equal_pressed()
- {
- double displayNumber;
- double secondNum = ui->display->text().toDouble();
- QString DisplayText;
- if (ui->pushButton_add->isChecked())
- {
- qDebug() << "New request: " << firstNum << " + " << secondNum;
- std::thread thread_2([&displayNumber,secondNum,this](){displayNumber = compute(add,firstNum,secondNum); });
- thread_2.join(); // это конечно неправильно, выходит тоже самое что и в одном потоке. Где-то нужно создать std::queue мб и туда помещать запросы
- DisplayText = QString::number(displayNumber,'g',15); // только как.
- ui->display->setText(DisplayText);
- ui->pushButton_add->setChecked(false);
- qDebug() << "Result: " << displayNumber;
- }
- else if (ui->pushButton_subtract->isChecked())
- {
- qDebug() << "New request: " << firstNum << " - " << secondNum;
- displayNumber = compute(substract,firstNum,secondNum);
- DisplayText = QString::number(displayNumber,'g',15);
- ui->display->setText(DisplayText);
- ui->pushButton_subtract->setChecked(false);
- qDebug() << "Result: " << displayNumber;
- }
- else if (ui->pushButton_mult->isChecked())
- {
- qDebug() << "New request: " << firstNum << " * " << secondNum;
- displayNumber = compute(mult,firstNum,secondNum);;
- DisplayText = QString::number(displayNumber,'g',15);
- ui->display->setText(DisplayText);
- ui->pushButton_mult->setChecked(false);
- qDebug() << "Result: " << displayNumber;
- }
- else if (ui->pushButton_divide->isChecked())
- {
- qDebug() << "New request: " << firstNum << " / " << secondNum;
- try
- {
- displayNumber = compute(divide,firstNum,secondNum);;
- if (secondNum == 0.0) {throw 1; }
- DisplayText = QString::number(displayNumber,'g',15);
- ui->display->setText(DisplayText);
- ui->pushButton_divide->setChecked(false);
- qDebug() << "Result: " << displayNumber;
- }
- catch (int e)
- {
- qDebug() << "Error: You cannot divide by zero!";
- }
- ui->pushButton_divide->setChecked(false); //чтобы можно было продолжить пользоваться программой, после деления на 0
- }
- userTypingSecondDigit = false;
- }
- double MainWindow::compute(int Type, double OperandA, double OperandB)
- {
- switch (Type) {
- case add:
- {
- std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms));
- return OperandA + OperandB;
- }
- case substract:
- {
- std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms));
- return OperandA - OperandB;
- }
- case mult:
- {
- std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms));
- return OperandA * OperandB;
- }
- case divide:
- {
- std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms));
- return OperandA / OperandB;
- }
- }
- }
Просьба помочь разобраться с данной задачей. QT для меня в новинку
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Добрый день!
Думаю, что вы можете воспользоваться QThread::moveToThread , как показано в статье.
Я бы на вашем месте создал класс внутренней логики калькулятора, который с помощью moveToThread будет передаваться в другой поток. Данный класс будет иметь свою рабочую петлю в которой будет ожидать данные для расчёта, данные можно будет помещать в QQueue с помощью сигнал/слотового соединения, аналогично извлекать данные с помощью сигнал слотового соединения. Соответственно в слотах нужно будет использовать QMutex, чтобы обезопасить данные.