Anuncios Google

Cronometro en C [Definitivamente SOLUCIONADO]

Hola!

Estoy intentando programar una apli, pero no se como crear un cronometro.

Intente usar el sceKenrelDelay pero se retrasa mucho.

Alguna sugerencia?



 

EDIT:

Ya conseguí la maldita precision :) todo gracias a joserc87 y a forums.qj.net(encontrareis muchas cosas allí, aunque esté en inglés).

La funcion que necesitaba era esta: sceKernelLibcClock();

que devuelve en microsegundos el tiempo que lleva funcionando la apli.

Y aquí os dejo el "corazon de un cronometro simple"

while(!osl_quit){
    int seg,dec,min,x;//iniciamos las variables
 
	for(seg=0, dec=0, min=0; min<=8; dec++)
	{
	//para determinar el retraso al escribir en pantalla, nos da el valor de tiempo en microsegundos desde la ejecucion del programa.
        clock_t start_time = sceKernelLibcClock();
 
        //si las decimas llegan a 10, reseteamos y sumamos un segundo
	if(dec==10)
	{dec=0;
	seg++;
	}
 
        //si los segundos llegan a 60 reseteamos y sumamos un minuto
	if(seg==60)
	{seg=0;
	min++;
	}
 
 
        //imprimimos valores
        printf(" %i:%i:%i",min,seg,dec);
 
        /*Ahora hacemos lo siguiente:
        aviso: pausa es sceDelayThread, teneis que definirlo
        0.1*1000000 es una decima, que le restamos el retraso
        el retraso es igual a el tiempo actual menos tiempo inicial*/
	pausa(0.1 * 1000000 - (sceKernelLibcClock() - start_time));
	 }
	 oslWaitKey();
	 }


Proyectos[PSP]

-The playbook: Fase 1"traduccion...."                Traducion al español del libro de las jugadas de la serie Como conocí a vuestra madre

-Wifi craker: pausada (En pausa debido a aprendizaje a aplicaciones en kernel mode :D)

-Cronometro Rubik:100%!!  Lastima que no la admitiesen en concurso!


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de joserc87

Regla de 3.

Sin ánimo de ofender, esa solución de hacer un delay(85615) es un poco chapucera no? A lo mejor a tí te funciona, pero no funcionará de forma precisa si la frecuencia de reloj no es la misma, y eso puede pasar fácilmente ya que puede cambiarse! Si te vale con eso ok, pero si quieres hacerlo bien busca otra solución. Mira abajo, que te he puesto un par de soluciones para que el delay sea variable según cuanto tarde cada iteración.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de roilivethelife

Intenté implementar la parte

Intenté implementar la parte de tu codigo pero no se por qué no funciona como debería.

Para probar el cronometro tengo una apli en el pc con la que puede calcular las "pulsaciones por minuto".

Al intentar usar tu parte de código me daba 52 (tendría ke dar 60).

No se porqué, pero no es problema de tu codigo, porque un sample del sdk es un reloj que escribe "tic"/"tac" segun pasan los segundos y me daba exactamente 52 igual ke con tu codigo.

 

Intentaré dar con el problema....


Proyectos[PSP]

-The playbook: Fase 1"traduccion...."                Traducion al español del libro de las jugadas de la serie Como conocí a vuestra madre

-Wifi craker: pausada (En pausa debido a aprendizaje a aplicaciones en kernel mode :D)

-Cronometro Rubik:100%!!  Lastima que no la admitiesen en concurso!

Imagen de barney77

Pues según se cada pasada de

Pues según se cada pasada de un loop infinito va a 0.1 segundos, entonces podrias hacer una variable de 0.1,  y que aumente uno a cada pasada del loop, y ya cuando esa variable(la de 0.1) sea 1 será un segundo ;).

Imagen de sting18

No tengo mucho tiempo espero

No tengo mucho tiempo espero te sirva esto.

int main(void) 

   int segundos, minutos, horas; 
    
   segundos = minutos = horas = 0; 
   while (minutos < 2){ 
      if (segundos == 60){ 
         minutos++; 
         segundos = 0; 
      } 
      
      if (minutos == 60){ 
         horas++; 
         minutos = 0; 
      } 
      
      printf("%02d:%02d:%02d\n", horas, minutos, segundos); 
      Sleep(1000); 
      segundos++; 
   } 
    
   return EXIT_SUCCESS; 
}

a y define Sleep.


Imagen de AitorDB

By Aitor

Una pregunta:

Risa¿Qué es el Wifi craker y que utilidad tiene?Risa

Imagen de luisadniel

pues por el nombre parece

pues por el nombre parece algo para decifrar claves de wi-fi

Saludos

Imagen de roilivethelife

El wifi craker es una apli

El wifi craker es una apli que estoy desarrollando para descifrar la clave de las redes wlan_xxxx

Eso va a hacer como minimo cuando salga a la luz.

Pero en el futuro añadire mas redes :)


Proyectos[PSP]

-The playbook: Fase 1"traduccion...."                Traducion al español del libro de las jugadas de la serie Como conocí a vuestra madre

-Wifi craker: pausada (En pausa debido a aprendizaje a aplicaciones en kernel mode :D)

-Cronometro Rubik:100%!!  Lastima que no la admitiesen en concurso!

Imagen de dj51_Shura

Bueno...

creo que es precisamente el sceKernelDelayThread(int) la función que debes usar. En C no existe ninguna función para detener la ejecución X tiempo, así que esta tampoco te servirá, pues el bucle seguirá pasando como si nada.

Otra forma de hacer un cronómetro, muy, muy poco precisa, es una variable índice, un bucle, y variable++:

printf("Cronómetro simple.\n\n")
 
int X; // index for the loop
for(X = 0; X < 30; X++) {
    printf(" Valor del índice: %i\n", X);
}
 
printf("\nLoop finished ;-)");

Tan solo usa X a tu gusto, pero... no es un cronómetro. El tiempo transcurrido no será exacto, así que... supongo que habría que probar con distintos valores.

Si alguien conoce otro método... que lo diga, es un tema muy interesante.

Un saludo

 


http://www.mhypnok.blogspot.com/

Gracias a Dark_AleX, Total_Noob, VirtuousFlame, Coldbird, Codestation...

Imagen de joserc87

Cronómetro.

Si a lo que te refieres es a detener la ejecución un tiempo, eso como te han dicho.

Sin embargo, si lo que quieres es medir el tiempo tienes que llamar a time para obtener el número de milisegundos cuando quieres comenzar la cuenta. Después la llamas otra vez en el momento en que quieres saber el tiempo transcurrido y restas el valor anterior, obteniendo así el número de milisegundos transcurridos (si lo divides por 1000 tienes el número de segundos):

time_t inicioCuenta;
 
inicioCuenta = time (NULL);
 
...
// Aquí podría ir un bucle, o lo que quieras
for (;;){
  time_t segundosTranscurridos = time (NULL);
  printf ("Han transcurrido %ld segundos", (secondTranscurridos-inicioCuenta)/1000);
}

Saludos.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de roilivethelife

Con el delay el problema es

Con el delay el problema es que no es nada preciso ya ke cada vuelta de for tiene ademas que incrementar una decima el tiempo, pintar en pantalla el tiempo, y tarda de más.

Nosé, igual dandole al delay valores menores de una decima para que sea preciso...

 

En el sdk encontre algo que ponia time.h pero no se como usar las funciones del header.


Proyectos[PSP]

-The playbook: Fase 1"traduccion...."                Traducion al español del libro de las jugadas de la serie Como conocí a vuestra madre

-Wifi craker: pausada (En pausa debido a aprendizaje a aplicaciones en kernel mode :D)

-Cronometro Rubik:100%!!  Lastima que no la admitiesen en concurso!

Imagen de joserc87

Precisión.

Si el problema es solo eso, la solución es bien simple:

- Una opción es medir el tiempo como te he puesto arriba.

- La otra opción es llamar al delay con el tiempo adecuado. Por ejemplo, si quieres que cada segundo exactamente pinte algo en pantalla, haces:

time_t inicioCuenta;
 
ultimaIter = time (NULL);
 
...
int contador=0;
for (;;){
  printf ("%d\n", contador);
  time_t actual = time (NULL);
  time_t transcurrido = actual - ultimaIter;
  ultimaIter = actual;
  // Esperar al siguiente segundo.
  delay (1000 - transcurrido);
  contador++;
}

Esto hace que se llame a printf exactamente cada segundo (siempre que delay sea preciso). Si aún lo quieres más preciso, tengo una solución aún mejor en la cabeza, pero es algo más compleja (no mucho más).

Saludos.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de roilivethelife

Yo tengo algo asi(se ke no

Yo tengo algo asi(se ke no esta todo correcto pero es para dar una idea:

for(seg=-1, dec=0; seg<=30; dec++)
	{
	pausa(1*100000);//1 decima de segundo
	if(dec==0) seg++;
	oslStartDrawing();	
	oslClearScreen(RGB(0,0,255));
	sprintf(mseg, "%i", seg);
	sprintf(mdec, "%i", dec);
	printff(40, 40, mseg);
	printff(80, 40, mdec);
	oslEndDrawing();
	oslSyncFrame();
	 }

(se  que con ese codigo los segundos no avanzan, pero da =)

Al ejecutar esa parte las decimas van muy lentas.


Proyectos[PSP]

-The playbook: Fase 1"traduccion...."                Traducion al español del libro de las jugadas de la serie Como conocí a vuestra madre

-Wifi craker: pausada (En pausa debido a aprendizaje a aplicaciones en kernel mode :D)

-Cronometro Rubik:100%!!  Lastima que no la admitiesen en concurso!

Imagen de joserc87

...

El código te lo había puesto para que captases la idea y lo hicieses tú mismo, pero en fin, adaptaré tu código para que tenga más precisión:

time_t ultimaIter;
 
ultimaIter = time (NULL);
 
for(seg=-1, dec=0; seg<=30; dec++){
	// Las siguientes 2 lineas calculan el tiempo que consume cada ciclo
	time_t actual = time (NULL);
	time_t transcurrido = actual - ultimaIter;
 
	// Este es tu código:
	pausa(1*100000 - transcurrido);//1 decima de segundo
	if(dec==0) seg++;
	oslStartDrawing();	
	oslClearScreen(RGB(0,0,255));
	sprintf(mseg, "%i", seg);
	sprintf(mdec, "%i", dec);
	printff(40, 40, mseg);
	printff(80, 40, mdec);
	oslEndDrawing();
	oslSyncFrame();
 
	ultimaIter = actual;
}

No lo he probado pero espero que funcione. Este método no es preciso si cada iteración tarda más de una décima, pero no creo que tarde tanto.

Saludos!


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.