Timer

La verdad es que soy principiante en Vc y no se como hacerlo.
Necesito implementar un timer (función OnTimer)en mi programa, esto es porque tengo una función que me lee datos del puerto serie y necesito que lo haga cada POR tiempo.
El programa consiste en que cada que haya una señal externa (en este caso el puerto serie) se tome una fotografía desde una webcam y se almacene en memoria... Ya todo esta solo falta la parte del timer.
Si alguien me puede ayudar mostrándome un segmento de código donde se utilice esta función, o me pueda dar otra idea de como hacerlo.

1 respuesta

Respuesta
1
De nuevo cristianm
No sé que compilador tienes. Si es el Microsoft Visual C++ debes actuar como t indico:
Para iniciar un temporizador debes llamar a la función de la clase CWnd, SetTimer. Esta función tiene esta forma:
SetTimer(UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD))
-NIDEvent el es identificador del temporizador (puedes tener más de uno activo en la misma ventana)
-NElapse es el periodo de tiempo tras el cual se ejecutara el temporizador, en milisegundos
-LpfnTimer es la función callback de tratamiento del temporizador. Si pones a NULL este parámetro (es lo habitual) se tratará en la función OnTimer de la ventana.
Ahora, necesitas crear la función OnTimer(). Debes saber que es la función que se ejecuta cuando una ventana recibe el mensaje WM_TIMER.
Si, como he dicho, tienes el Microsoft Visual Studio, ejecuta el ClassWizard (ctrl+w). En la ventana 'class name:' selecciona la clase de la ventana donde establecerás el temporizador.
Ahora vete a la ventana 'Messages' y haz doble click sobre el mensaje WM_TIMER, verás que el classwizard te ha creado la función OnTimer. Clicka en 'Edit Code' e iras al código de la función.
Veras que la función OnTimer recibe como parámetro un UINT (unsigned int), ese es el identificador del temporizador que se ha ejecutado.
Entonces dependiendo del parámetro o identificador actuaras de una forma u otra.
Así que si tienes varios temporizadores, esta función kedaria algo parecido a esto:
void MiVentana::OnTimer(UINT nIDEvent)
{
switch( nIDEvent)
{
case 1:
{
//....codigo de tratamiento del temporizador 1
break;
}
case 2:
{
//....codigo de tratamiento del temporizador 2
break;
}
default:
{
//...por defecto
break;
}
}
}
Espero q t haya kedado claro. Si no ha sido asi t puedo enviar un pekeño ejemplo, tan solo dame tu e-mail
Nuevamente muchas gracias por tu valiosa ayuda raguin, esta muy bien explicado aunque si te agradecería que me mandaras un ejemplo para aclarar más conceptos. Como mencione antes soy principiante en todo esto y si me ha costado un poco de trabajo entender bien.
Mi correo es:
[email protected]
Espero tu respuesta, Gracias
Atentamente. Cristian
Otra vez molestándote raguin..
He hecho como me has indicado en tu respuesta y espero estar bien, pero me surge un error y con ello una duda:
1.- He puesto la función SetTimer dentro de la función para leer el puerto, no se si así es correcto, como se mueatra a continuación:
void ReadCom(char *buf)
{
HANDLE hCom;
DWORD x;
ReadFile(hCom, buf, 1, &x, NULL);
SetTimer(1,2000,NULL);
}
2.-Al compilar el programa me sale un error como el siguiente:
error C2660: 'SetTimer' : function does not take 3 parameters
¿Qué significa esto, no esta bien la función o que clase o librería debo tener en mi programa?
3.- Al hacerlo de esta manera, suponiendo que el programa corre sin errores, ¿debo insertar en la función que lee el puerto (ReadFile)mi función que se encarga de tomar la fotografía? ¿O en que parte del programa?
Gracias por tus consejos y valiosa ayuda raguin..
Atentamente. Cristian
De nuevo cristian,
Puedes estar tranquilo, no m molesta que hagas tantas preguntas como quieras, para eso estoy.
1. La función SetTimer se llama parea que la función OnTimer se ejecute cada por milisegundos (los que tu establezcas) así que debes llamar a SetTimer tras la inicialización del puerto y debes llamar a tu función ReadCom en la función OnTimer.
2. La función SetTimer recibe tres parámetros cuando se ejecuta la función SetTimer de la clase CWnd . Así que si la llamas fuera del código de una ventana (CWnd) estarás llamando a la función SetTimer de la API de Windows, que recibe 4 parámetros, el primero, el manejador (o identificador de una ventana) y los otros tres parámetro restantes los mismos que CWnd::SetTimer.
3. Como ya t he dicho, debes llamar a la función ReadCom en la función OnTimer. Si hay datos en el buffer, entonces lees la imagen y sino sales de la función OnTimer sin leer la imagen

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas