2009-10-27 3 views
0

Ok, так что я с этой проблемой сегодня:Qt4 запуска и остановки (паузы)

[...] 

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) 
    { 
    } 
} 
[...] 

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

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

ответ

0

Вам нужно будет изучить резьбу. Расчет блокирует ui.

0

Ну, в «Введение в шаблоны проектирования в 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())); 
} 

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

+0

Это работает хорошо, если вы можете разбить вычисление на дискретные шаги и повторно называть функцию таймера на нем, если вам нужно продолжать вычислять что угодно. Кроме того, вам не нужно указывать указатель QTimer ... внутри QTimer есть функция удобства: «QTimer :: singleshot (0, это, SLOT (calculate());». –