Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: d2011hacker en 24 Junio 2011, 00:18 am



Título: clase contador con SeTTimer
Publicado por: d2011hacker en 24 Junio 2011, 00:18 am
esta clase la hice para unas tareas redundantes para una presentasion, necesitaba un contador. el tema es que al principio no se puede compilar el codigo, pero despues compila pero no funciona. mi clase contador se sentra en la funcion SetTimer de windows. pongo todo el codigo, quisiera que me ayuden a modificarla para que ande correctamente.

Código:

/*
Clase Contador por WDR
UTN
*/

class Contador
{

public:
Contador()
{
terminado=false;
}

       static void EnTiempo(HWND hWnd,UINT_PTR nIDEvent,UINT uElapse,TIMERPROC lpTimerFunc)
       {
                //terminado=true;
                cout << "TEST: callback llamada" << endl;
       }

void Temporizador(void)
{
SetTimer(NULL,1,milisegundos, (TIMERPROC) Contador::EnTiempo);
}

void setMilisegundos(int ms)
{
milisegundos=ms;
}

void setSegundos(int s)
{
milisegundos=(s*1000);
}

bool Finalizado()
{
return terminado;
}

private:
bool terminado;
int milisegundos;
};


Código:
int main()
{
    Contador c;
    c.setSegundos(30);
    c.Temporizador();

    system("PAUSE");

    return 0;
}

Esto compila pero no anda, como se ve al terminar el tiempo deberia llamar a esa funcion de callback que es metodo de la clase. notese que tube que poner un cout para saber si era llamada la callback, pero para que compile tube que ponerla static. yo en verdad lo que quiero no es poner un cout sino que cambie el valor del flag "terminado". Aparte de eso ni siquiera anda. Agradezco la ayuda




Título: Re: clase contador con SeTTimer
Publicado por: BlackZeroX en 24 Junio 2011, 01:59 am
lo que pasa es que nesesitas "Despachar" los mensajes de windows... agrega el siguiente codigo y llamalo antes del return ( Antes de la finalizacion del proceso Main() )

Código
  1.  
  2. VOID ProcessMessages()
  3. {
  4.    MSG msg;
  5.    while (GetMessage(&msg, NULL, NULL, NULL) != -1)
  6.        DispatchMessage(&msg);
  7. }
  8.  
  9.  

por si quieres un ejemplo mas concreto:

http://foro.elhacker.net/programacion_cc/src_lineas_aleatorias_en_la_pantalla-t313040.0.html

Por otro lado para cambiar la velocidad del timer debes realizarle un KillTimer() y despues un SetTimer, tambien debes realizar un KillTimer() en el destructor de la clase...

Por otro lado el Callback deberias hacerlo fuera de la clase, de tal forma dicho callback se cargara N cantidad de veces sean requeridas es decir N clases Corriento ( Con el Timer ensendido ) = N copias del callback en memoria.

de igual manera cada clase deberia tener un ID unico para cada timer, es decir vas a tener que crear una coleccion de id para saber que id's puedes usar... por hay en esa clase SIEMPRE USAS EL ID 1 por lo tanto no importa cuantas clases cargues SIEMPRE manejaran 1 solo Timer.

Dulces Lunas!¡.