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.

¿Fue útil?

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 ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top