Duda con temporizador en C++

Iniciado por SrCooper, 7 Julio 2013, 00:13 AM

0 Miembros y 1 Visitante están viendo este tema.

SrCooper

Buenas, estoy haciendo un videojuego en C++ con allegro, y me gustaría ejecutar una función 3 segundos después de que se haya ejecutado otra. (Es decir ejecutar una función, esperar tres segundos, y ejecutar la otra.)

No quiero usar la función rest(3000), porque esto ralentiza el juego al estar ejecutandose en un bucle while.
Quisiera saber si hay alguna libreria o algún truco que me sirva. He buscado en google un poco, pero no encuentro mi problema en particular.

Un saludo y gracias de antemano ;D

amchacon

¿Te refieres a una función que se ejecute cada 3 segundos?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

SrCooper

Cita de: amchacon en  7 Julio 2013, 00:16 AM
¿Te refieres a una función que se ejecute cada 3 segundos?

Ya encontré como hacer eso, pero no es a lo que me refiero. Lo que me gustaría es algo como así:
Código (cpp) [Seleccionar]

void funcion_principal(){
       funcion1();
       esperar(3);
       funcion2();
}


Y luego en el main poder llamar a "funcion_principal" y que esta se ejecute en ese orden y con ese tiempo. No se si me explico... :xD
Un saludo

amchacon

Cita de: SrCooper en  7 Julio 2013, 00:25 AMY luego en el main poder llamar a "funcion_principal" y que esta se ejecute en ese orden y con ese tiempo. No se si me explico... :xD
Pues no xD.

Aver, main llama a funcion_principal(). En funcion_principal() llama a funcion1(), espera 3 segundos y después llama a funcion2().

Si es eso, solo tendrías que poner rest(3000), si no es eso entonces no te entiendo... A no ser que quieras que la función y el main se ejecuten al mismo tiempo (¿Es eso?)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

SrCooper

Cita de: amchacon en  7 Julio 2013, 00:29 AM
Pues no xD.

Aver, main llama a funcion_principal(). En funcion_principal() llama a funcion1(), espera 3 segundos y después llama a funcion2().

Si es eso, solo tendrías que poner rest(3000), si no es eso entonces no te entiendo... A no ser que quieras que la función y el main se ejecuten al mismo tiempo (¿Es eso?)

Exacto, lo has entendido perfectamente. Es justo eso lo que quiero que haga, pero NO puedo usar el rest porque entonces se para TODO el juego y yo solo quiero que se pare esa función.

Mi idea es que mientras se esperan 3 segundos el while se ejecute normalmente las veces que haga falta y cuando haya pasado el tiempo se ejecute funcion2.

Un saludo

amchacon

#5
Es decir, una tarea en segundo plano.

Pues la manera más sencilla (relativamente) es usando threads (hilos). C++ tiene una clase para threads pero es relativamente nueva (no todos los compiladores están actualizados con ella).

Asi que te hago un ejemplo con las Windows API:

Código (cpp) [Seleccionar]
#include <winalleg.h>


DWORD WINAPI Funcion( LPVOID lpParam )
{
 Funcion1();
 rest(3000);
 Funcion2();
}

int main()
{
  //...
  CreateThread(NULL,0,Funcion,NULL, 0,NULL);  

 while(!key[KEY_ESC] && !choque )
 {{/code]
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

SrCooper

Vale, entonces cuando en el while yo ejecute Funcion, esta se ejecutará automáticamente en segundo plano, ¿no?

La verdad es que no entiendo muy bien todo eso de DWORD, LPVOID y lpParam. ¿Qué significan exactamente?

Ya verás, ahora con esto mi juego del Snake va a mejorar mucho xDD
Un saludo y gracias :D

amchacon

Cita de: SrCooper en  7 Julio 2013, 01:10 AM
Vale, entonces cuando en el while yo ejecute Funcion, esta se ejecutará automáticamente en segundo plano, ¿no?
Desde el momento de CreateThread, se ejecutarán en segundo plano.

Cita de: SrCooper en  7 Julio 2013, 01:10 AMLa verdad es que no entiendo muy bien todo eso de DWORD, LPVOID y lpParam. ¿Qué significan exactamente?
Son expresiones que se han inventado los de microsoft... Son tan especialitos, su equivalencia es la siguiente:

DWORD = unsigned int
LPVOID = void*

Y lpParam es el nombre que le he puesto al parámetro de la función (se le puede pasar un parámetro al hilo), también le podría haber puesto "habichuelas".

Te recomiendo que hagas algunas prácticas con hilos... Si tienes linux mejor (ahí tienes la librería pthread que es más fácil que Windows API).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

amchacon

Cita de: amchacon en  7 Julio 2013, 01:14 AMDesde el momento de CreateThread, se ejecutarán en segundo plano.
Una nota sobre esto, cuando la función del hilo termine también terminará la tarea.

Si quieres que se repita continuamente tendrías que poner un while:

Código (cpp) [Seleccionar]
DWORD WINAPI Funcion( LPVOID lpParam )
{
  while(true)
  {
      Funcion1();
      rest(3000);
      Funcion2();
  }
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

SrCooper

Cita de: amchacon en  7 Julio 2013, 01:14 AM
Te recomiendo que hagas algunas prácticas con hilos... Si tienes linux mejor (ahí tienes la librería pthread que es más fácil que Windows API).

Eso voy a hacer la verdad, porque es la primer vez que oigo de su existencia y me podrían ser muy útiles. Sí, tengo linux, pero por alguna razón no me funciona bien allegro así que utilizaré windows.
Un saludo y gracias por todo :P