Question

J'écris un planificateur de tâches simples et un rappel à l'aide de QT qui jouera un fichier audio lorsque la date et l'heure d'une tâche donnée correspondent à la date et à l'heure actuelles.

Pour implémenter cela, j'exécute un QThread qui vérifie la tâche dans la liste pour voir si une correspondance à l'heure actuelle et dans le cas, joue le fichier son.

Cet identifiant ma classe originale:

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

Ceci est ma classe de fil:

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

  private:
      QList<Task> list;
};

Mon implémentation:

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);
    }
}  

Le fait est que le fil fonctionne parfaitement, mais le if() condition à l'intérieur du foreach() Loop n'est jamais satisfait pour une raison quelconque. J'ai même vérifié le paramètre de date / heure / alarme individuel (t.ala) en utilisant des QDebugs (comme vous pouvez le voir); ils sont tous bien.

Était-ce utile?

La solution

Ton if La déclaration exige que le match de date et d'heure exactement, jusqu'à la milliseconde. Il est peu probable que votre boucle évalue à ce moment exact. Si vous souhaitez maintenir une logique similaire (traitement des tâches dans une boucle), vous pouvez essayer de les trier par "la prochaine tâche d'abord" (ou peut-être utiliser une file d'attente), puis tester dans votre if déclaration si le courant QDateTime est égal à-ou plus grand que la date / heure de la tâche de la première tâche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top