Pregunta

Estoy escribiendo un planificador de tareas simple y un recordatorio usando QT que reproducirá un archivo de sonido cuando la fecha y la hora de cualquier tarea dada coincida con la fecha y hora actuales.

Para implementar esto, estoy ejecutando un QThread que verifica la tarea en la lista para ver si coincide con la hora actual y, si es así, reproduce el archivo de sonido.

Esta id mi clase original:

class Task
{
  public:
      QString ta, desc;
      QTime ti;
      QDate da;
      int pri, diff;
      bool ala;
};  

Esta es mi clase de hilo:

class AlarmCheck : public QThread
{
  public:
      void setTask(QList<Task>);
      void run();
      bool isRunning;
      QString music;
      QTime alarmOffset;

  private:
      QList<Task> list;
};

Mi implementación:

void AlarmCheck::setTask(QList<Task> l)
{
    list = l;
}

void AlarmCheck::run()
{
    while(isRunning)
    {
        foreach(Task t, list)
        {
            if((t.da == QDate::currentDate()) && (t.ti == QTime::currentTime()) && t.ala)
            {
                Phonon::MediaObject *gaana =
                        Phonon::createPlayer(Phonon::MusicCategory,
                                              Phonon::MediaSource(music));
                gaana->play();
                QMessageBox::information(NULL,
                                         "Alarm!!!",
                                         "The time has come for\n"
                                         + t.ta +
                                         "\n Time to do it!");
                gaana->stop();
            }
            qDebug("Curr = " + QTime::currentTime().toString().toAscii() + " Date = " + QDate::currentDate().toString().toAscii());
            qDebug("Task = " + t.ti.toString().toAscii() + " Date = " + t.da.toString().toAscii());                
        }
        sleep(1);
    }
}  

La cosa es que el hilo está funcionando perfectamente, pero el if() condición dentro del foreach() El bucle nunca está satisfecho por alguna razón. Incluso revisé la configuración individual de fecha/hora/alarma (t.ala) usando qdebugs (como puede ver); todos ellos están bien.

¿Fue útil?

Solución

Su if La declaración requiere que la fecha y la hora coincidan exactamente, hasta el milisegundo. Es poco probable que su bucle evalúe en este momento exacto. Si desea mantener una lógica similar (tareas de procesamiento en un bucle), puede intentar clasificarlas "la siguiente tarea primero" (o tal vez usando una cola), luego pruebe en su if Declaración si la actual QDateTime es igual a-o mayor que la fecha/hora de la tarea de la primera tarea.

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