2012-01-16 54 views
2

我正在編寫一個簡單的任務計劃程序和使用Qt的提醒,當任何給定任務的日期和時間與當前日期和時間匹配時,它將播放一個聲音文件。無法匹配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); 
    } 
} 

的事情是,線程運行完美,但foreach()循環內的if()條件永遠不會由於某種原因而滿意。我甚至使用qDebugs檢查了各個日期/時間/鬧鐘設置(t.ala)(如您所見);他們都很好。

回答

2

您的if聲明要求日期和時間匹配恰好爲,下降到毫秒。你的循環不太可能在這個時刻評估。如果要維護類似的邏輯(循環中的處理任務),您可以嘗試通過「下一個任務優先」(或者可能使用隊列)對它們進行排序,然後在您的if語句中測試當前QDateTime是否等於-或大於第一個任務的任務日期/時間的

+0

偉大的戴夫。非常感謝那真的機智的答覆。我還有一個疑問是,我實際上將這個目標瞄準了Symbian S60第五版平臺;這不會持續1秒的檢查會對手機電池造成沉重的負擔嗎?如果是的話,有沒有更好的方法來完成這項任務? – 2012-01-17 05:27:51

+0

我根本不熟悉Symbian平臺的架構。您可能想要另外提出一個問題,以獲得關於在該平臺上處理定時器的「最佳實踐」的建議。但總的來說,是的,在一個循環中不斷查詢會導致「錯誤」,99.9%的時間不是理想的解決方案。通常可以使用某種調度程序API,或者至少有一個計時器,您可以以較低的間隔進行輪詢。 – 2012-01-17 13:27:51

+0

好的,謝謝。我想我會看看QTimer API。看起來很有希望! – 2012-01-18 14:08:14

相關問題