我正在编写一个简单的任务规划器和使用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 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
)(如您所见);他们都很好。
答案 0 :(得分:2)
您的if
声明要求日期和时间完全匹配,直到毫秒。您的循环不太可能在此时刻进行评估。如果你想保持类似的逻辑(在一个循环中处理任务),你可以尝试先按&#34;下一个任务排序&#34; (或者可能使用队列),然后在if
语句中测试当前QDateTime
是否等于或更大,而不是第一个任务日期/时间任务。