Ir al contenido


Foto

Como ajustar timer?


  • Por favor identifícate para responder
No hay respuestas en este tema

#1 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 12 agosto 2010 - 03:43

Hola foro, amigos tengo la siguiente duda, almaceno tareas en un .ini o .txt, las cuales deben ejecutarse cada cierto tiempo (día-hora). Tengo un timer  preguntando cada segundo. Es decir recorro el .ini pregunto por los times y si son = a ahora que se ejecute la tarea. Como me pareció un poco rustico el preguntar cada segundo y no se cuando hacerlo hice lo siguiente:
Cuando creo una tarea leo el .ini y calculo cual es el time mas cercano a ahora utilizando


cpp
  1. #include <DateUtils.hpp>
  2. 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
  1. // ---analizar tiempo de backup
  2. // se calcula la diferencia entre el backup mas cercano
  3. // y se le asigna el valor al intervalo del timer
  4. void fun(TTimer *timer) {
  5.  
  6. // setTimerInterval
  7. TIniFile *ini = new TIniFile(dirDataBase);
  8. TStringList *slScc = new TStringList;
  9. ini->ReadSections(slScc);
  10. __int64 difTime = 0;
  11. TDateTime taskDateTime;
  12. // ---variable que almacena la primera diferencia de
  13. // --segundos y sirve de guia
  14. __int64 guiaDateTime = 0;
  15.  
  16. // ---analizando si se debe deshabilitar el timer
  17. // ---si no hay tareas
  18. if (slScc->Count < 1) {
  19. timer->Enabled = false;
  20. delete slScc;
  21. delete ini;
  22. return;
  23. }
  24. // ---si hay una tarea y es manual
  25. if (slScc->Count == 1) {
  26. if (ini->ReadString(slScc->Strings[0], "pInterval", "pManually")
  27. == "pManually") {
  28. timer->Enabled = false;
  29. delete slScc;
  30. delete ini;
  31. return;
  32. }
  33. }
  34.  
  35. // ---analizando las horas
  36. // --recorrer secciones
  37. for (int i = 0; i < slScc->Count; i++) {
  38. // almacenar nombre seccion
  39. String scc = slScc->Strings[i];
  40. // obtener el tipo de tarea
  41. String typeTask = ini->ReadString(scc, "pInterval", "pManually");
  42. // si tarea Once
  43. if (typeTask == "pOnce") {
  44. taskDateTime = ini->ReadDateTime(scc, "dateTime", Now());
  45. difTime = SecondsBetween(Now(), taskDateTime);
  46. }
  47. else if (typeTask == "pEveryFewDays") {
  48. // obtener fecha y hora de proxima tarea
  49. taskDateTime = StrToDateTime(getEveryFewDays(scc, ini));
  50. difTime = SecondsBetween(Now(), taskDateTime);
  51. }
  52. else if (typeTask == "pDayOfWeek") {
  53. taskDateTime = StrToDateTime(getEveryFewDays(scc, ini));
  54. difTime = SecondsBetween(Now(), taskDateTime);
  55. }
  56. // ---si es la primera tarea pasar a guia
  57. if (i == 0)
  58. guiaDateTime = difTime;
  59. else {
  60. // ---si no es la primera compara diferencia
  61. difTime = SecondsBetween(Now(), taskDateTime);
  62. // ---comprar con guia
  63. // ---si difTime < guia pasar a guia
  64. if (difTime < guiaDateTime)
  65. guiaDateTime = difTime;
  66. }
  67. // --asignandole al timer guia
  68. // max timer interval 429496795
  69. double toTime = guiaDateTime * 1000;
  70.  
  71. while (toTime >= 429496795) {
  72. toTime = toTime / 2;
  73. }
  74.  
  75. timer->Interval = toTime;
  76. timer->Enabled = true;
  77. }
  78. delete slScc;
  79. delete ini;
  80. return;
  81.  
  82. }




  • 0




IP.Board spam blocked by CleanTalk.