Impossible de faire correspondre la date et l'heure actuelles dans QT
Question
J'écris un planificateur de tâches simples et un rappel à l'aide de QT qui jouera un fichier audio lorsque la date et l'heure d'une tâche donnée correspondent à la date et à l'heure actuelles.
Pour implémenter cela, j'exécute un QThread
qui vérifie la tâche dans la liste pour voir si une correspondance à l'heure actuelle et dans le cas, joue le fichier son.
Cet identifiant ma classe originale:
class Task
{
public:
QString ta, desc;
QTime ti;
QDate da;
int pri, diff;
bool ala;
};
Ceci est ma classe de fil:
class AlarmCheck : public QThread
{
public:
void setTask(QList<Task>);
void run();
bool isRunning;
QString music;
QTime alarmOffset;
private:
QList<Task> list;
};
Mon implémentation:
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);
}
}
Le fait est que le fil fonctionne parfaitement, mais le if()
condition à l'intérieur du foreach()
Loop n'est jamais satisfait pour une raison quelconque. J'ai même vérifié le paramètre de date / heure / alarme individuel (t.ala
) en utilisant des QDebugs (comme vous pouvez le voir); ils sont tous bien.
La solution
Ton if
La déclaration exige que le match de date et d'heure exactement, jusqu'à la milliseconde. Il est peu probable que votre boucle évalue à ce moment exact. Si vous souhaitez maintenir une logique similaire (traitement des tâches dans une boucle), vous pouvez essayer de les trier par "la prochaine tâche d'abord" (ou peut-être utiliser une file d'attente), puis tester dans votre if
déclaration si le courant QDateTime
est égal à-ou plus grand que la date / heure de la tâche de la première tâche.