我正在使用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 forn"
+ 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
)(如您所见);他们都很好。
您的if
语句要求日期和时间与完全匹配,精确到毫秒。您的循环不太可能在这个确切的时刻进行评估。如果您想保持类似的逻辑(在循环中处理任务),可以尝试按"下一个任务优先"(或者可能使用队列)对它们进行排序,然后在if
语句中测试当前QDateTime
是否等于-或大于第一个任务的任务日期/时间。