Impossibile abbinare la data e l'ora correnti in QT
Domanda
Sto scrivendo un semplice pianificatore di attività e promemoria usando QT che riprodurrà un file audio quando la data e l'ora di una determinata attività corrisponde alla data e all'ora corrente.
Per implementare questo, sto eseguendo un file QThread
Il che controlla l'attività nell'elenco per vedere se eventualmente corrispondere all'ora corrente e, in tal caso, riproduce il file audio.
Questo ID è la mia classe originale:
class Task
{
public:
QString ta, desc;
QTime ti;
QDate da;
int pri, diff;
bool ala;
};
Questa è la mia classe di thread:
class AlarmCheck : public QThread
{
public:
void setTask(QList<Task>);
void run();
bool isRunning;
QString music;
QTime alarmOffset;
private:
QList<Task> list;
};
La mia implementazione:
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);
}
}
Il fatto è che il thread funziona perfettamente, ma il if()
condizione all'interno del foreach()
Loop non è mai soddisfatto per qualche motivo. Ho persino controllato la singola impostazione della data/ora/allarme (t.ala
) usando Qdebugs (come puoi vedere); Stanno tutti bene.
Soluzione
Tuo if
La dichiarazione richiede che la data e l'orario Esattamente, fino al millisecondo. È improbabile che il tuo ciclo valuta in questo esatto momento. Se si desidera mantenere una logica simile (compiti di elaborazione in un ciclo), potresti provare a risolverli con "Attività successiva prima" (o forse usando una coda), quindi testando il tuo if
Dichiarazione Se la corrente QDateTime
è uguale a-Or-Greater rispetto alla data/ora dell'attività della prima attività.