• Domingo 15 de Diciembre de 2024, 13:35

Autor Tema:  Proceso siempre activo  (Leído 1641 veces)

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Proceso siempre activo
« en: Lunes 29 de Marzo de 2010, 23:27 »
0
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
The sweet smell of a great sorrow lies over the land.


Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Proceso siempre activo
« Respuesta #1 en: Martes 30 de Marzo de 2010, 00:22 »
0
¿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).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Proceso siempre activo
« Respuesta #2 en: Miércoles 31 de Marzo de 2010, 14:43 »
0
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).aspx


suerte!
 :hola:

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Proceso siempre activo
« Respuesta #3 en: Miércoles 14 de Abril de 2010, 23:27 »
0
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
The sweet smell of a great sorrow lies over the land.