Cuando creo una tarea leo el .ini y calculo cual es el time mas cercano a ahora utilizando
cpp
#include <DateUtils.hpp> SecondsBetween(Now(), taskDateTime)
Cuando obtengo cual es la diferencia mas corta ajusto el Interval del timer a esa diferencia de segundo*1000 ya que 1seg =1000 en el Timer.
Hasta ahora no me funciona 100% bien y tengo mis dudas sobre si es la mejor forma de preguntar periódicamente sobre cuando hacer una tarea.
Quisiera saber la opinión de uds y si tienen una mejor forma de hacer lo que quiero. Acá les dejo el código por si no me entienden del todo.
cpp
// ---analizar tiempo de backup // se calcula la diferencia entre el backup mas cercano // y se le asigna el valor al intervalo del timer void fun(TTimer *timer) { // setTimerInterval TIniFile *ini = new TIniFile(dirDataBase); TStringList *slScc = new TStringList; ini->ReadSections(slScc); __int64 difTime = 0; TDateTime taskDateTime; // ---variable que almacena la primera diferencia de // --segundos y sirve de guia __int64 guiaDateTime = 0; // ---analizando si se debe deshabilitar el timer // ---si no hay tareas if (slScc->Count < 1) { timer->Enabled = false; delete slScc; delete ini; return; } // ---si hay una tarea y es manual if (slScc->Count == 1) { if (ini->ReadString(slScc->Strings[0], "pInterval", "pManually") == "pManually") { timer->Enabled = false; delete slScc; delete ini; return; } } // ---analizando las horas // --recorrer secciones for (int i = 0; i < slScc->Count; i++) { // almacenar nombre seccion String scc = slScc->Strings[i]; // obtener el tipo de tarea String typeTask = ini->ReadString(scc, "pInterval", "pManually"); // si tarea Once if (typeTask == "pOnce") { taskDateTime = ini->ReadDateTime(scc, "dateTime", Now()); difTime = SecondsBetween(Now(), taskDateTime); } else if (typeTask == "pEveryFewDays") { // obtener fecha y hora de proxima tarea taskDateTime = StrToDateTime(getEveryFewDays(scc, ini)); difTime = SecondsBetween(Now(), taskDateTime); } else if (typeTask == "pDayOfWeek") { taskDateTime = StrToDateTime(getEveryFewDays(scc, ini)); difTime = SecondsBetween(Now(), taskDateTime); } // ---si es la primera tarea pasar a guia if (i == 0) guiaDateTime = difTime; else { // ---si no es la primera compara diferencia difTime = SecondsBetween(Now(), taskDateTime); // ---comprar con guia // ---si difTime < guia pasar a guia if (difTime < guiaDateTime) guiaDateTime = difTime; } // --asignandole al timer guia // max timer interval 429496795 double toTime = guiaDateTime * 1000; while (toTime >= 429496795) { toTime = toTime / 2; } timer->Interval = toTime; timer->Enabled = true; } delete slScc; delete ini; return; }