2

我正在使用 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(如您所见)检查了各个日期/时间/警报设置( );他们都很好。

4

1 回答 1

2

您的if声明要求日期和时间精确匹配,精确到毫秒。您的循环不太可能在这个确切时刻进行评估。如果您想维护类似的逻辑(循环处理任务),您可以尝试按“下一个任务优先”(或者可能使用队列)对它们进行排序,然后在您的if语句中测试当前QDateTime是否等于或大于比第一个任务的任务日期/时间。

于 2012-01-16T17:59:30.823 回答