Многопоточный калькулятор
Здравствуйте.
Задача сделать так, чтобы программа работала в двух потоках. Нужно искусственно слипать поток, дабы эмулировать долгие вычисления.
В первом: 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 для меня в новинку
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Akiv Doros
- 12 ноября 2024 г. 1:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50баллов,
- Очки рейтинга-4
- molni99
- 26 октября 2024 г. 11:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80баллов,
- Очки рейтинга4
- molni99
- 26 октября 2024 г. 11:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20баллов,
- Очки рейтинга-10
Добрый день!
Думаю, что вы можете воспользоваться QThread::moveToThread , как показано в статье.
Я бы на вашем месте создал класс внутренней логики калькулятора, который с помощью moveToThread будет передаваться в другой поток. Данный класс будет иметь свою рабочую петлю в которой будет ожидать данные для расчёта, данные можно будет помещать в QQueue с помощью сигнал/слотового соединения, аналогично извлекать данные с помощью сигнал слотового соединения. Соответственно в слотах нужно будет использовать QMutex, чтобы обезопасить данные.