Вопрос

Хорошо, сегодня вечером у меня возникла такая проблема:

[...]   

connect(startButton, SIGNAL(clicked()), this, SLOT(startCalculation()));
connect(stopButton, SIGNAL(clicked()), this, SLOT(stopCalculation()));

[...]

void MainWindow::startCalculation()
{
   qDebug() << "hello";
   this->startButton->setDisabled(true);
   this->stopButton->setEnabled(true);
   this->calcStatus = true;
   this->calculate();
}

void MainWindow::stopCalculation()
{
    this->startButton->setEnabled(true);
    this->stopButton->setDisabled(true);
    this->calcStatus = false;
}


void MainWindow::calculate()
{
   qDebug() << "hello";
   while(this->calcStatus)
   {
   }
}
[...]

Я пытаюсь сделать так, чтобы процедуру вычисления() можно было остановить в любой момент, но сразу после ее запуска я теряю контроль и не могу нажать СТОП.Конечно, в моих планах на будущее, метод метода Calculation() будет «вычислять» что-то реальное (например,моделирование теплопередачи).

Спасибо за предложения.П.

Это было полезно?

Решение

Вам нужно было бы изучить потоки. Расчет блокирует пользовательский интерфейс.

Другие советы

Ну, во «Введении в шаблоны проектирования на C++ с помощью Qt4» они говорят, что

«Можно избежать использования потоков в пользу цикла событий QT в сочетании с Qtimers»

но я никогда не пробовал :)

Вообще-то, я только что попробовал...

добавлять:

QTimer      *Timer;

в заголовке класса MainWindow и в конструкторе MainWindow добавьте:

Timer = new QTimer(this);

затем измените функцию Calculate() на сигнал и измените:

void MainWindow::startCalculation()
{
    qDebug() << "hello";
    this->startButton->setDisabled(true);
    this->stopButton->setEnabled(true);
    this->calcStatus = true;
    connect(Timer, SIGNAL(timeout()), this, SLOT(calculate()));
    Timer->start(0);
}

void MainWindow::stopCalculation()
{
    this->startButton->setEnabled(true);
    this->stopButton->setDisabled(true);
    this->calcStatus = false;
    Timer->stop();
    Timer->disconnect(this,SLOT(calculate()));
} 

Это должно работать, пока вы не передаете какие-либо аргументы в метод расчета().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top