Qt4 iniciando y deteniendo (pausa)
Pregunta
Ok, entonces tengo este problema esta noche:
[...]
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)
{
}
}
[...]
Estoy tratando de hacer que el procedimiento del cálculo () se pueda detener en cualquier momento, pero justo después de comenzar, pierdo el control y no puedo presionar STOP. Por supuesto, en mis planes futuros, el cálculo () va a " calcular " algo real (por ejemplo, simulación de transferencia de calor).
Gracias por las sugerencias. P.
Solución
Tendrías que investigar el enhebrado. El cálculo bloquea la interfaz de usuario.
Otros consejos
Bueno, en "Introducción a los patrones de diseño en C ++ con Qt4" dicen eso
" es posible evitar el uso de hilos a favor del Qt Event Loop combinado con QTimers "
pero nunca lo he probado :)
En realidad, acabo de intentarlo
agregar:
QTimer *Timer;
en el encabezado de la clase MainWindow y en el constructor MainWindow, agregue:
Timer = new QTimer(this);
luego cambie el cálculo () de la función a una señal y modifique:
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()));
}
Esto debería funcionar siempre que no pase ningún argumento a Calculate ().