Невозможно сопоставить текущую дату и время в Qt - PullRequest
2 голосов
/ 16 января 2012

Я пишу простой планировщик задач и напоминание, используя Qt, который будет воспроизводить звуковой файл, когда дата и время любой задачи совпадают с текущей датой и временем.

Чтобы реализовать это, я запускаю QThread, который проверяет задачу в списке, чтобы узнать, совпадает ли она с текущим временем, и если да, воспроизводит звуковой файл.

Это мой первоначальный класс:

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

Это мой класс темы:

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

  private:
      QList<Task> list;
};

Моя реализация:

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

Дело в том, что поток работает отлично, но условие if() внутри цикла foreach() почему-то никогда не выполняется. Я даже проверил индивидуальную настройку даты / времени / будильника (t.ala) с помощью qDebugs (как вы можете видеть); они все в порядке.

1 Ответ

2 голосов
/ 16 января 2012

Ваше утверждение if требует, чтобы дата и время соответствовали точно , с точностью до миллисекунды.Вряд ли ваш цикл будет оценивать именно в этот момент.Если вы хотите сохранить аналогичную логику (обработка задач в цикле), вы можете попробовать отсортировать их по «следующей задаче» (или, возможно, с использованием очереди), а затем проверить в вашем операторе if, равен ли текущий QDateTime-to- или более , чем дата / время первого задания.

...