SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Epa en Lunes 29 de Marzo de 2010, 23:27

Título: Proceso siempre activo
Publicado por: Epa en Lunes 29 de Marzo de 2010, 23:27
Buenas.
Aca aparezco con una nueva consulta, haber si alguien me puede dar una manito.

Hice un programa (de tipo ventana en windows) que tiene que realizar una tarea cada un determinado tiempo, pero resulta que el temporizador solo funciona si la ventana tiene el foco y no esta minimizada.
Alguien sabe como puedo hacer para que el proceso siga corriendo siempre?

Por si sirve de algo esta es mas o menos la forma en que funciona:

Código: C++
  1.  
  2. time_t ultimo;
  3.  
  4.    time(&ultimo);
  5.  
  6.     while (GetMessage (&messages, NULL, 0, 0))
  7.     {
  8.         TranslateMessage(&messages);
  9.         DispatchMessage(&messages);
  10.  
  11.         if (count(&ultimo))
  12.         {
  13.            SendMsg(chwnd, VK_F4);
  14.         }
  15.     }
  16.  
  17.  
  18.  
  19. bool count(time_t *ultimo)
  20. {
  21.      time_t actual;    
  22.      time(&actual);
  23.      
  24.      if( actual >= (*ultimo + 300)){
  25.          *ultimo = actual;
  26.          return true;
  27.      }
  28.      return false;  
  29. }
  30.  
  31.  
  32.  
  33.  

Se agradece.
Saludos
Título: Re: Proceso siempre activo
Publicado por: Eternal Idol en Martes 30 de Marzo de 2010, 00:22
¿Solo hace una cosa? ¿Necesita una ventana? Tal vez un bucle con un Sleep sea una solucion mucho mas simle e igual de efectiva (depende del problema, claro).
Título: Re: Proceso siempre activo
Publicado por: diego.martinez en Miércoles 31 de Marzo de 2010, 14:43
Comprueba primero, como dice Eternal Idol, si realmente necesitas una ventana para simplemente contar. Si sigues necesitandola entonces:

Cita de: "Epa"
 
while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
 
        if (count(&ultimo))
        {
           SendMsg(chwnd, VK_F4);
        }
    }

GetMessage bloquea el proceso hasta que hay un mensaje en la ventana.

Mejor usa:
Cita de: "Epa"
 
while (1)
{
while (PeekMessage (&messages, NULL, 0, 0,PM_REMOVE))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    if (count(&ultimo))
    {
          SendMsg(chwnd, VK_F4);
     }
    Sleep(1);
}

El PeekMessage retorna haya o no mensaje, y con el PM_REMOVE, emula el comportamiento del GetMessage.
Recuerda poner un Sleep(1) para evitar el consumo alto de cpu.

Otra cosa, para contar segundos, puedes usar la Api  :

SetTimer
KillTimer

http://msdn.microsoft.com/en-us/library/ms644906(VS.85 (http://msdn.microsoft.com/en-us/library/ms644906(VS.85" onclick="window.open(this.href);return false;)).aspx


suerte!
 :hola:
Título: Re: Proceso siempre activo
Publicado por: Epa en Miércoles 14 de Abril de 2010, 23:27
Muchas gracias por las respuestas, se soluciono con el peekmessage.

El codigo que puse es solo una partecira, que me parecia relevante al tema.

No se si es totalmente necesario que sea con ventanas, pero necesito que el usuario pueda iniciar y parar las tareas, y modificar ciertos aprametros sin que esto interfiera (demasiado) en la ejecucion de las tareas. Por lo que me parecio que iba a ser mas sencillo de esa manera.

gracias y saludos