Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: alexalfonso en 1 Junio 2013, 16:17 pm



Título: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: alexalfonso en 1 Junio 2013, 16:17 pm
HEY NECESITO UNA AYUDA CON ESTO ( C++ ):

Es muy simple, imprime las milésimas de segundo hasta que llega a la cantidad de milésimas que escribimos de primero.

#include<windows.h>
#include<iostream>
#include<cstdlib>
#include<time.h>

using namespace std;

int main()
{
int t=0;
int fin=0;
cin>>fin;
while(fin>t)

{
cout<<t<<endl;
Sleep(1);
t++;
}

system("pause");

return 0;
}

Investigué durante días por mi mismo pero nada así que ahora acudo a los profesionales XD.

El problema es que el Sleep no me esta marcando el tiempo de forma exacta, se tarda como 12 segundos en llegar a 1000, no lo he probado en otra pc, PERO ALGO MÁS RARO ES QUE LO HE INTENTADO REESCRIBIR Y A VECES MARCA EL TIEMPO TAN EXACTO QUE LO COMPARO CON EL DE LA PC Y VA PERFECTO, LUEGO EN ALGÚN MOMENTO YA NO LO MARCA BIEN, CUANDO LO ABRO NUEVAMENTE, O AL SIGUIENTE DÍA, QUE LO QUIERO PROBAR. Creo que he intentado de todo pero si no funciona algo me hace falta.

Apenas comienzo a programar así que disculpen si hay algún error de novato.


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: daryo en 1 Junio 2013, 16:29 pm
es que se produce un retardo por cada vez que llamas sleep y lo llamas por cada milisegundo de ahi la demora .

Código
  1. int main()
  2. {
  3. int t=0;
  4. int fin=0;
  5. cin>>fin;
  6. Sleep(fin);
  7.  
  8.  
  9. system("pause");
  10.  
  11. return 0;
  12. }
en este caso el sleep si dura lo que le pones ..

como concejo intenta buscar otra forma de contar el tiempo  el Sleep simplemente es una pausa

:P

mira una forma para contar el tiempo:
Código
  1. #include<windows.h>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<time.h>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10. clock_t start = clock();
  11.  
  12. /* Aqui va el codigo */
  13. while(true)
  14. {
  15.  
  16. cout << "Tiempo transcurrido: " << ((double)clock() - start) << endl;
  17.  
  18.  
  19. }
  20. return 0;
  21. }
  22.  

incluso si pones un sleep que te cuenta cada 1000 milisegundos es decir cada segundo el sleep es mucho mas exacto
Código
  1. cout << "Tiempo transcurrido: " << ((double)clock() - start) << endl;
  2. Sleep(1000);
  3.  


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: amchacon en 1 Junio 2013, 16:33 pm
El tiempo que pones en el sleep es el tiempo mínimo que permanecerá dormido, dependiendo de la carga que tenga el SO el tiempo será el mismo o más.

Ahora bien, esos descompases de tiempo no son normales:

Código:
se tarda como 12 segundos en llegar a 1000
¿En serio? A mi me tarda 1s:
http://imageshack.us/a/img7/4753/sinttulofmr.png

Esto no es un ejercicio de cálculo, aunque tuvieras un procesador de hace 10 años no debería darte valores tan bestias... Me da a mi que el problema está en como mides el tiempo.

Citar
es que se produce un retardo por cada vez que llamas sleep y lo llamas por cada milisegundo de ahi la demora .
No importa, una CPU puede hacer 1000 llamadas sin problemas (de hecho, son 3000, por el cout y el endl).


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: daryo en 1 Junio 2013, 16:38 pm

No importa, una CPU puede hacer 1000 llamadas sin problemas (de hecho, son 3000, por el cout y el endl).
prueba el segundo programa y veras que es mucho mas exacto

saludos


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: amchacon en 1 Junio 2013, 20:41 pm
prueba el segundo programa y veras que es mucho mas exacto
No te digo que no, lo que me refiero esque hacer 3000 llamadas no cuesta 11 segundos *_*


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: daryo en 1 Junio 2013, 21:03 pm
No te digo que no, lo que me refiero esque hacer 3000 llamadas no cuesta 11 segundos *_*

probe el codigo y se demoro 27 segundos .
tengo un core i3 primera generacion  con 4gb de ram y windows 7 recien instalado  :P asi que tampoco es tan viejo ps y en cambio el otro si se demoro el tiempo que debia xD

ademas multiplica esas 3000(ni idea si realmente son 3000 o es que sleep usa muchas mas de esas o menos) llamadas por cada milisegundo eso supongo si llega a generar desface dependiendo de tu pc()

supongo tambien influye la cantidad de procesos que este haciendo el pc en el momento


PD:sospecho que tienes un mounstro de pc  y que te llamas miguel  :xD


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: amchacon en 1 Junio 2013, 21:36 pm
ademas multiplica esas 3000 llamadas por cada milisegundo eso supongo si llega a generar desface dependiendo de tu pc()
Hace 3 llamadas por milisegundo, lo que equivale a 3000 llamadas en un segundo.

Pon tres couts en un bucle y comprueba lo que tarda en hacerlo 1000 veces (los endl cuentan también como un cout).

tengo un core i3 primera generacion  con 4gb de ram y windows 7 recien instalado  :P asi que tampoco es tan viejo ps y en cambio el otro si se demoro el tiempo que debia xD

PD:sospecho que tienes un mounstro de pc  y que te llamas miguel  :xD
Tengo un i5 2400 3,2 GHZ y 4 gb de ram... Es mejor que el tuyo pero tampoco es un monstruo xD

¿Es dual core o quad core? El poder hacer más cosas a la vez puede influir en el sleep... También puede ser que tengas la CPU a rebosar... ¿Has activado la optimización del compilador? (-O2)

PD: Has descubierto mi nombre, ahora tendré que matarte  >:D


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: alexalfonso en 2 Junio 2013, 03:20 am
MUCHAS GRACIAS POR RESPONDER, LAMENTO NO HABER RESPONDIDO ANTES.

Me he visto en la obligación de desconectarme este día  :silbar:

revisaré cuidadosamente todo y avisaré cuando ya no tenga problemas. LA PC NO PUEDE SER LA CAUSA:

FX 6200 3.8 GHZ
4 GB corsair vegance blue
mother GIGABYT GA-970A-UD3

No es la gran cosa pero peor es nada xD

Uso AMD POR QUE NO ME ALCANZABA PARA EL INTEL  :laugh:

PERO AUN CON LA MÍNIMA CARGA QUE PUDE PONERLE, el programa a veces funcionaba y a veces no, hablo de que ahora en la mañana lo probé nada, acabo de probarlo funcionó, lo probé antes de subirlo a internet funcionó, lo descargué y nada, y estoy hablando del ejecutable, bueno pero me han dado pistas o quizás la repuesta.


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: alexalfonso en 2 Junio 2013, 03:37 am
Citar
ademas multiplica esas 3000 llamadas por cada milisegundo eso supongo si llega a generar desface dependiendo de tu pc()

EL PROGRAMA HA FUNCIONADO PERFECTAMENTE LO QUE PASA ES QUE A VECES DEJE DE FUNCIONAR, Y NO IMPORTA QUE HAGA SE MANTIENE CONTANDO LENTO EL TIEMPO.
_____________________________________________________________

El valor de los 12 segundos fue aproximado (9 - 12 segundos)
_____________________________________________________________

Citar
probe el codigo y se demoro 27 segundos .

Algo así me pasa
_____________________________________________________________

Citar
El tiempo que pones en el sleep es el tiempo mínimo que permanecerá dormido, dependiendo de la carga que tenga el SO el tiempo será el mismo o más.

Tenía entendido que el Sleep podía retrasar el tiempo con una precisión mayor que diezmilésimas de segundo.

" Sleep(0.01); "

_____________________________________________________________


Citar
como concejo intenta buscar otra forma de contar el tiempo  el Sleep simplemente es una pausa

Gracias por el momento, creo que usaré eso, pero me niego a dejar así ese problema, seguramente es algo muy muy raro y eso me intriga seguiré realizando pruebas usando sus aportes como soporte y buscaré el problema
 
 ;-)  ;-) ;-)  ;-)


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: leosansan en 2 Junio 2013, 05:26 am
HEY NECESITO UNA AYUDA CON ESTO ( C++ ):

Es muy simple, imprime las milésimas de segundo hasta que llega a la cantidad de milésimas que escribimos de primero.

El problema es que el Sleep no me esta marcando el tiempo de forma exacta, se tarda como 12 segundos en llegar a 1000,

Es hasta cierto punto normal ya que el compilador mide el tiempo total de la ejecución del programa y tal como lo tienes no sólo cuenta el tiempo de 1 segundo correspondiente a Sleep(1) 1000 veces, según pones en el código, sino que además hay un retardo considerable empleado en la impresión por pantalla de los 1000 números así como el retardo en presionar enter debida a la función system. Es este tiempo empleado el que origina que en lugar de tardar 1 segundo tarde los 12 que tú comentas, aunque aún con la impresión es algo elevado y lo achaco al retardo adicional en introducir el dato de 1000.

Para ver si tardaría 1 segundo, como pareciera en un principio por el bucle de Sleep(1) 1000 veces habría que desactivar la impresión y la función system, aún así tardaría un pelin más por  las llamadas a la memoria e incrementos correspondientes de la variable.

Me ha salido  1.015 segundos, muy cercano al 1 segundo esperado, dando de antemano el valor de 1000 a la variable y desactivando la impresión y el system, para descontar el tiempo que tardo en introducir dicho valor y el enter:


Código
  1. #include<windows.h>
  2. #include<iostream>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    int t=0,fin;
  9.    /*cin>>*/fin=1000;
  10.    while(fin>t)
  11.    {
  12.        //cout<<t<<endl;
  13.        Sleep(1);
  14.        t++;
  15.    }
  16.    //ystem("pause");
  17. return 0;
  18. }
  19.  


Y lo que viene es para el amigo amchacon, ¿o podemos llamarte ya Miguel?:


¿En serio? A mi me tarda 1s:
http://imageshack.us/a/img7/4753/sinttulofmr.png


A mí me podéis llamar por mi nombre de pila León, :o  sí de nombre, no de apellido. Y lo de "san" es por el primer apellido :-) . Además, para más inri, soy leo de  horóscopo, ni tan siquiera, como buen leo, me interesan los demás signos zodiacales, sencillamente no tienen la suerte de ser leo. Y, como no y según habeís podido observar, mi animal preferido con diferencia es el León.  ;)

Rápido, rápido tu PC, el mio tarda algo más, 1.01. O como me comento, creo que mr.blood dejo de tener abiertas a la vez que el Code:Blocks 27, sí 27 contaditas, páginas web, música a todo volumen, así como los programas Python -sí, no puedo estar sólo con C y C++, en los que soy un aficionado, no como ustedes que son aunténticos profesionales, y  Matlab y Mathematica que son en lo que realmente trabajo duramente ahora y,  casi me olvido, mantengo abiertas las puertas del Facebook, el antiguo Messenger, ahora Skype mientras con utorrent y la mulita me descargo los últimos y no tan últimos estrenos y documentos varios y paro de contar mi vida, ! curiosos, que sois unos curiosos!. El problema de ser, aún a mi ya elevada edad y, a pesar de la enfermedad, una persona hiperactiva

Me entra una duda existencial al ver la imagen que posteas, ¿por que creas un proyecto para probar un código tan simple cuando puedes sencillamente crear un File nuevo?. La ventaja de trabajar con file es que puedes mantener "operativos" multitud de files para "probar"cosas mientras con un proyecto sólo puedes probar uno, cerrar y abrir otro proyecto y así sucesivamente. Yo uso ventanitas múltiples en Code::Blocks y cada una con múltiples pestañas. Así trabajo yo (http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/codeblocks_zpsf862c35d.jpg), en general dejando proyectos para programas que necesiten de varios file a la vez. Y eso porque ahora estoy en un portátil de tan solo 18 pulgadas, porque en la torre con uno de los monitores de 32 pulgadas mantengo nueve ventanitas abiertas, en lugar de las seis que aparecen en la imagen anterior. Y sí , estoy en esta situación porque ando reinstalado el Windows 7 -el 8 me resisto todavía a instalarlo, me parece poco práctico para un ordenador de sobremesa, es más bien para tablets y smarpfones- debido  a que una actualización automática me mando a la porra el sistema. Parece mentira pero aún ocurren cosas como esas.


Saluditos desde Gran Canaria! .... ...(http://i1280.photobucket.com/albums/a497/leosansan/GRAN%20CANARIA/gran-canaria-3782-H-600_zps551ac681.jpg)

(http://smilies-gifs.com/hola-adios/8hola-adios.gif)


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: amchacon en 2 Junio 2013, 10:26 am
Y lo que viene es para el amigo amchacon, ¿o podemos llamarte ya Miguel?:
¡Claro! Miguel para los amigos  ::)

A mí me podéis llamar por mi nombre de pila León, :o  sí de nombre, no de apellido. Y lo de "san" es por el primer apellido :-) . Además, para más inri, soy leo de  horóscopo, ni tan siquiera, como buen leo, me interesan los demás signos zodiacales, sencillamente no tienen la suerte de ser leo. Y, como no y según habeís podido observar, mi animal preferido con diferencia es el León.  ;)
¿Te acuerdas de la antigua ministra de defensa? (Carmen Chacón). Ese es mi apellido (que no significa que sea pariente de la exministra ni nada)

Mi nombre de pila es Miguel Ángel + Chacón: Machacon, pero como queda un poco feo le damos la vuelta: amchacon

Ah, y también soy Leo  ;D

Rápido, rápido tu PC, el mio tarda algo más, 1.01. O como me comento, creo que mr.blood dejo de tener abiertas a la vez que el Code:Blocks 27, sí 27 contaditas, páginas web, música a todo volumen, así como los programas Python -sí, no puedo estar sólo con C y C++, en los que soy un aficionado, no como ustedes que son aunténticos profesionales, y  Matlab y Mathematica que son en lo que realmente trabajo duramente ahora y,  casi me olvido, mantengo abiertas las puertas del Facebook, el antiguo Messenger, ahora Skype mientras con utorrent y la mulita me descargo los últimos y no tan últimos estrenos y documentos varios y paro de contar mi vida, ! curiosos, que sois unos curiosos!.
Me vais a sonrojar, y eso que dije que mi pc no es ningún monstruo (monstruo es quien tiene una CPU de 500€  :silbar:).

Yo soy un fan de C++ hasta la medula, probé Java y me pareció un C++ capado con un rendimiento menor... Vamos que no.

El problema de ser, aún a mi ya elevada edad y, a pesar de la enfermedad, una persona hiperactiva
No se porqué, yo creía que tenías veinti-pocos.

No te pongas malito leo  :-\

Me entra una duda existencial al ver la imagen que posteas, ¿por que creas un proyecto para probar un código tan simple cuando puedes sencillamente crear un File nuevo?.
Tengo un proyecto ya creado para las pruebas, cuando abro el codeblocks solo tengo que clicar en proyectos recientes y listo.

La ventaja de trabajar con file es que puedes mantener "operativos" multitud de files para "probar"cosas mientras con un proyecto sólo puedes probar uno, cerrar y abrir otro proyecto y así sucesivamente.
No es cierto, puedes tener varios proyectos abiertos. Luego puedes elegir el foco dando doble click sobre su nombre

Yo uso ventanitas múltiples en Code::Blocks y cada una con múltiples pestañas. Así trabajo yo (http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/codeblocks_zpsf862c35d.jpg), en general dejando proyectos para programas que necesiten de varios file a la vez. Y eso porque ahora estoy en un portátil de tan solo 18 pulgadas
Yo tengo un monitor de 17 pulgadas, ya me quejo del tamaño como para dividirlo aún más  ;D

Prefiero ir cambiando de fichero que perder visibilidad.

Saluditos desde Gran Canaria! .... ...
Natural de Andalucía (Córdoba) durante los primeros 18 años de mi vida, ahora vivo en Valencia pero nada como el clima Andaluzz


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: leosansan en 2 Junio 2013, 11:18 am

Un fuerte saludo de éste canarión y gracias por contribuir a hacer esto menos impersonal de lo que ya es.  ;-) ;-) ;-)

Saluditos .... Miguel!. .....
(http://st.forocoches.com/foro/images/smilies/ciao.gif)


Título: Re: AYUDA CON C++ SLEEP (MANEJO DE TIEMPO)
Publicado por: alexalfonso en 2 Junio 2013, 17:00 pm
No he tenido más problemas, así que les agradezco a todos:

amchacon             ;-) ;-)
daryo                   ;-) ;-)
leosansan            ;-) ;-)

he probado el programa con impresión de cada milésima durante una hora, el retraso fue de 6 segundos 0.16 % de error con la carga del sistema en uso normal. Muy aceptable para lo que tenia pensado hacer.