Невозможно сопоставить текущую дату и время в Qt

Я пишу простой планировщик задач и напоминание, используя 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 (как видите); они все в порядке.


person Rahul De    schedule 16.01.2012    source источник


Ответы (1)


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

person Dave Mateer    schedule 16.01.2012
comment
Великолепный Дэйв. Большое спасибо за действительно остроумный ответ. Еще одно мое сомнение заключается в том, что я на самом деле нацелен на платформу Symbian s60 5th edition; не будет ли эта постоянная 1-секундная проверка тяжелым бременем для аккумулятора телефона? если да, есть ли лучший способ выполнить эту задачу? - person Rahul De; 17.01.2012
comment
Я вообще не знаком с архитектурой платформы Symbian. Возможно, вы захотите задать отдельный вопрос, чтобы получить совет о лучших методах работы с таймерами на этой платформе. Но в целом, да, постоянно выполнять запросы в цикле, которые в 99,9% случаев приводят к ложным результатам, не являются идеальным решением. Обычно есть какой-то API-интерфейс планировщика, к которому вы можете подключиться, или, по крайней мере, таймер, который вы можете опрашивать через менее частые интервалы. - person Dave Mateer; 17.01.2012
comment
Хорошо спасибо. Думаю, я посмотрю на QTimer API. Выглядит многообещающе! - person Rahul De; 18.01.2012