質問

特定のタスクの日付が現在の日付と時刻と一致するときにサウンドファイルを再生する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() 何らかの理由でループが満足することはありません。個々の日付/時刻/アラーム設定を確認しました(t.ala)qdebugsの使用(ご覧のとおり);彼らはすべて大丈夫です。

役に立ちましたか?

解決

君の if ステートメントでは、日付と時刻の一致が必要です まさに, 、ミリ秒まで。この正確な瞬間にループが評価される可能性は低いです。同様のロジック(ループでタスクを処理)を維持する場合は、「次のタスク最初」(またはキューを使用する)で並べ替えてからテストしてみてください。 if 声明の場合 QDateTime 同等です -or-reater 最初のタスクのタスク日付/時刻よりも。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top