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
)(如您所見);他們都很好。
偉大的戴夫。非常感謝那真的機智的答覆。我還有一個疑問是,我實際上將這個目標瞄準了Symbian S60第五版平臺;這不會持續1秒的檢查會對手機電池造成沉重的負擔嗎?如果是的話,有沒有更好的方法來完成這項任務? – 2012-01-17 05:27:51
我根本不熟悉Symbian平臺的架構。您可能想要另外提出一個問題,以獲得關於在該平臺上處理定時器的「最佳實踐」的建議。但總的來說,是的,在一個循環中不斷查詢會導致「錯誤」,99.9%的時間不是理想的解決方案。通常可以使用某種調度程序API,或者至少有一個計時器,您可以以較低的間隔進行輪詢。 – 2012-01-17 13:27:51
好的,謝謝。我想我會看看QTimer API。看起來很有希望! – 2012-01-18 14:08:14