2

特定のタスクの日付と時刻が現在の日付と時刻と一致したときにサウンド ファイルを再生する Qt を使用して、簡単なタスク プランナーとリマインダーを作成しています。

これを実装するためQThreadに、リスト内のタスクをチェックして現在の時刻と一致するタスクがあるかどうかを確認し、一致する場合はサウンド ファイルを再生する を実行しています。

これは私の元のクラスのIDです:

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()qDebugs を使用して個々の日付/時刻/アラーム設定 ( t.ala) を確認しました (ご覧のとおり)。彼らはすべて元気です。

4

1 に答える 1

2

ステートメントでは、日付と時刻がミリ秒まで正確ifに一致する必要があります。ループがまさにこの瞬間に評価される可能性は低いです。同様のロジック (タスクをループで処理する) を維持したい場合は、「次のタスクを最初に」(またはおそらくキューを使用して) 並べ替えてから、ステートメントで現在の値が等しいかより大きいかどうかをテストすることができます。最初のタスクのタスク日時よりも。ifQDateTime

于 2012-01-16T17:59:30.823 に答える