elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Dudas con Timer como sustituto de Sleep -- por precisión del tiempo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Dudas con Timer como sustituto de Sleep -- por precisión del tiempo  (Leído 3,340 veces)
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Dudas con Timer como sustituto de Sleep -- por precisión del tiempo
« en: 24 Julio 2014, 17:36 pm »

Hola a todos.

Tengo un problema con la función Sleep() y es que el argumento que se le pasa solo puede ser un 'int', y yo necesito "programar" una tarea con más precisión en el tiempo.
Por ello he pensado en usar System::Timers::Timer.

He leído y probado un ejemplo en el que imprimo por pantalla un "HOLA" cada 3.12 segundo. El problema es que la tarea que yo necesito hacer cada 'x' tiempo recibe 3 argumentos y esta es la parte que no se hacer.

¿Alguien me ayuda por favor?

EDITO:
Ya he conseguido hacerlo mediante atributos de clase pero ahora tengo otro problema.

Programo el Timer para que haga su tarea cada 10 milisegundos (Timer.interval=10), y lo pongo a trabajar durante 3 segundos. Es decir, tendría que realizar dicha tarea un total de 300 veces pero solo llega a 260. Con Sleep conseguía hace muchas mas.
¿Alguien saber por qué pasa esto y/o sabe que puedo hacer?

Gracias.


« Última modificación: 24 Julio 2014, 18:02 pm por SARGE553413 » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Dudas con Timer como sustituto de Sleep -- por precisión del tiempo
« Respuesta #1 en: 24 Julio 2014, 18:53 pm »

Hola

Tengo un problema con la función Sleep() y es que el argumento que se le pasa solo puede ser un 'int', y yo necesito "programar" una tarea con más precisión en el tiempo.
Por ello he pensado en usar System::Timers::Timer.

¿He entendido mal o estás insinuando que en tu proyecto necesitas detener un thread durante más de 24 Días?, porque ese es el alcanze máximo del Int32, no se que más precisión puedes necesitar en el tiempo... además el valor mínimo de ambos es "1" milisegundo.

Máximo tiempo:
Código
  1. Threading.Thread.Sleep(TimeSpan.FromMilliseconds(Integer.MaxValue))

En días son:
Código
  1. MessageBox.Show(TimeSpan.FromMilliseconds(Integer.MaxValue).TotalDays)
<>
Código:
24,8551348032407

Y en milisegundos son:
Código
  1. MessageBox.Show(Integer.MaxValue)
<>
Código:
2147483647

En total son +596 horas, lo cual obviamente es más que suficiente para cualquier tipo de necesidad.

No se como intentar ayudarte sin entender mejor el problema que tienes, pero yo deduzco que has enfocado mal la utilización del método y lo que pretendes conseguir con ello.



Programo el Timer para que haga su tarea cada 10 milisegundos (Timer.interval=10), y lo pongo a trabajar durante 3 segundos. Es decir, tendría que realizar dicha tarea un total de 300 veces pero solo llega a 260.

Un Timer es lo más impreciso que puedes utilizar (me refiero entre las opciones de las que dispones), como alternativa podrías utilizar un StopWatch, el tiempo no se mide de la misma manera entre un Timer-StopWatch, los métodos de uso son distintos y hay que tener en cuenta que ambos hacen una ESTIMACIÓN del tiempo de ejecución, quizás nunca puedan tener una precisión 100% exacta si esperas que un Timer/Stopwatch haga todos los ticks que esperas que haga en un lapso determinado de tiempo,
de todas formas tampoco has mostrado el código para saber si otros factores pueden estar influyendo, pero vamos ...eso no importa mucho mientras sigas utilizando un impreciso Timer.

Saludos!



« Última modificación: 24 Julio 2014, 19:50 pm por Eleкtro » En línea



SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Dudas con Timer como sustituto de Sleep -- por precisión del tiempo
« Respuesta #2 en: 25 Julio 2014, 00:11 am »

OK, gracias por la respuesta.

Por preciso no me refiero a números altos, si no a muy bajos, a décimas de milisegundo.

¿Lo más apropiado para eso es stopWath?

Gracias y saludos.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Dudas con Timer como sustituto de Sleep -- por precisión del tiempo
« Respuesta #3 en: 25 Julio 2014, 01:10 am »

Por preciso no me refiero a números altos, si no a muy bajos, a décimas de milisegundo.

Pues eso me parece incluso mucho, pero mucho peor.

¿Porque necesitas tanta precisión?, exigir reiteradamente operaciones en un tiempo menor que 10-100 ms no es nada sano para tu aplicación, cuanto más pequeño y más continuo sea el lapso más acabaría mermando el rendimiento en general tanto de la aplicación como del equipo.

De todas formas, te informo:

Según un articulo de MSDN del que ahora mismo no dispongo la url (fue movido o eliminado), tanto el 'System.Windows.Forms.Timer' como el 'System.Timers.Timer' tienen una precisión media de 10 a 55 ms según la versión de Windows en ejecución (y otros factores a tener en cuenta como el consumo de las otras aplicaciones que estén en segundo plano), y estos no están diseñados para cronometrar de forma precisa, sino para desencadenar eventos en un intervalo específico.

Por lo contrario, un StopWatch es todo lo contrario a un Timer, es como un cronómetro y su función si es la de (intentar) medir el tiempo de forma precisa.

Pero la precisión de un StopWatch depende de varios factores en los que tú no puedes influir, como por ejemplo el hardware instalado (los contadores de rendimiento) y el sistema operativo en ejecución:
· http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.ishighresolution%28v=vs.110%29.aspx

Así como también depende de la frecuencia de los ticks:
·  http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.frequency%28v=vs.110%29.aspx
Citar
For example, a timer frequency of 2 million ticks per second equals a timer resolution of 500 nanoseconds

En mi caso la propiedad "Stopwatch.Frequency" me devuelve un valor estático de "3.919.409", pero escribí un código para testearlo y me suma alrededor de "3.923.329" de ticks por segundo, puedes comprobar cuantos ticks haces tú:
Código
  1.        Dim sw As New Stopwatch
  2.  
  3.        With sw
  4.  
  5.            .Start()
  6.  
  7.            While .ElapsedMilliseconds <= 1000
  8.                Debug.WriteLine(.ElapsedTicks)
  9.            End While
  10.  
  11.            .Stop()
  12.  
  13.        End With

Además debes asegurarte de utilizar la propiedad Stopwatch.ElapsedTicks para medir microsegundos/nanosegundos, no la propiedad Elapsed.Ticks ya que este devuelve un TimeSpan, y aquí tienes una explicación más detallada de ello:
· http://stackoverflow.com/questions/1562850/precise-time-in-net

¿Lo más apropiado para eso es stopWath?

Sí, es a lo que más puedes aspirar.

También podrías utilizar la API QueryPerformanceCounter y QueryPerformanceFrequency pero aparte de que esto nunca lo he probado (no me surge la necesidad ni tampoco me interesa) se supone que el Stopwatch es un wrapper de esas funciones, así que básicamente debe ser lo mismo, pero aquí tienes un ejemplo:
· http://msdn.microsoft.com/en-us/library/aa964692%28v=vs.85%29.aspx

Saludos.
« Última modificación: 25 Julio 2014, 01:33 am por Eleкtro » En línea



SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Dudas con Timer como sustituto de Sleep -- por precisión del tiempo
« Respuesta #4 en: 25 Julio 2014, 16:19 pm »

Ok, gracias por la respuesta.

Ye he visto que lo que quería hacer requiere, mas que nada, un SO en tiempo real.

No obstante he podido solucionarlo de manera que no tengo que ser tan preciso con el tiempo, la solución que he encontrado es hacer digamos hacer operaciones "extra" (sin tener que frenar el thread durante ese tiempo) y luego eliminar las operaciones realizadas sobrantes.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
aumentar el tiempo del timer
Programación Visual Basic
bautistasbr 8 5,636 Último mensaje 23 Junio 2006, 21:03 pm
por Meg
Sleep Timer, temporizador automático para Windows
Noticias
wolfbcn 2 2,993 Último mensaje 11 Marzo 2012, 00:30 am
por Kase
AYUDA CON C++ SLEEP (MANEJO DE TIEMPO) « 1 2 »
Programación C/C++
alexalfonso 12 10,580 Último mensaje 2 Junio 2013, 17:00 pm
por alexalfonso
sustituto de funcion sleep de window.h c++?
Programación C/C++
minari02 5 6,060 Último mensaje 1 Enero 2014, 14:50 pm
por amchacon
Timer en vez de Sleep.
.NET (C#, VB.NET, ASP)
Meta 9 3,631 Último mensaje 23 Febrero 2019, 12:00 pm
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines