PDA

Ver la Versión Completa : actualizar aplicacion


israelgs
06-10-2004, 07:51:04
Tengo un problema haber si me pudieran ayudar


Mi problema es que tengo que hacer que lea en este while cada milisegundo

Esta en builder c++ 6

TDateTime Time;

while(true)
{
//saco el tiempo
Time=Now();
//Le doy formaro a la variable de tiempo
uno=Time.FormatString("hh:nn:ss zzz");
Memo1->Lines->Add(uno);
Sleep(1);// un milisegundo
Application->ProcessMessages(); // procesar los demas mensajes
}

Corriendo ejemplo
Hora:Minuto:Segundo:Milisegundo
00:34:17 921
00:34:17 937
00:34:17 953
00:34:17 968
00:34:17 984
00:34:18 000
00:34:18 015

Lo que quisiera es lo siguiente
¿Es posible esto?
00:34:17 921
00:34:17 922
00:34:17 923
00:34:17 924
00:34:17 925
00:34:17 926

Neftali [Germán.Estévez]
06-10-2004, 09:49:11
TDateTime Time;

while(true)
{
//saco el tiempo
Time=Now();
//Le doy formaro a la variable de tiempo
uno=Time.FormatString("hh:nn:ss zzz");
Memo1->Lines->Add(uno);
Sleep(1);// un milisegundo
Application->ProcessMessages(); // procesar los demas mensajes
}


Creo que son demasiadas cosas para hacer en un milisegundo... ;) Si haces unas cuanteas cosas (Now() tarda bastante y actualizar las líneas del memo también) y luego además le dices que espere 1 milisegundo (sleep(1)) es poco probable que puedeas conseguir una resolución de 1 milisegundo.
Deberías probar con un Timer y colocar el Interval a 1 (y eliminar el Sleep), aunque creo que sigue siendo una resolución muy pequeña.
¿exactamente qué necesitas hacer cada milisegundo?

barman
06-10-2004, 12:59:16
Si necesitas tanta precision, no te va a quedar mas remedio que programarlo con un TThread, que es un hilo independiente.

israelgs
06-10-2004, 18:26:12
¿Sera seguro esa respuesta (Threads)?

para empezar a programar threads porque necesito precision

Gracias saludos

barman
08-10-2004, 13:05:52
Hombre pues deberias de saber que en informatica no hay nada seguro.

Depende de lo que quieras hacer, puedes hacerlo con un thread, que corre paralelo a tu aplicacion (programacion con Hilos), y asi no deberias de hacer el Application ->Proccesmessage(), tambien puedes crearte un componente deribado de TMemo y le metes un TTimer activado a xxxx milisegundos, a bote pronto no se me ocurre otra cosa.

israelgs
09-10-2004, 06:21:30
Gracias por sus opinione

Sonic
15-10-2004, 14:01:43
Buenas a todos!

Mi experiencia cada vez que he trabajado con restricciones de tiempo es que en Windows es muy dificil mantenerlas a "raja tabla" :(, cuando pones un Timer y le das un tiempo tienes que contar con que tu proceso (y dentro de él, tu hilo) sea el que está activo en el procesador en ese instante, si no, se irán acumulando retrasos.

En concreto, yo necesitaba actualizar ciertos valores cada 30ms y al cabo de 24 o 48 h el error ya era de minutos, lo que hice fue poner un timer cada 10ms y comprobar el tiempo con las funciones ftime. Si habían pasado 30ms desde la última actualización entonces se hacía una nueva actualización de las variables y también del contador. De este modo no consigues asegurar que cada 30 milisegundos se te actualicen las variables, pero al menos los errores no se te acumulan y te aseguras un error instantáneo del 33%.

Claro que si necesitas procesar algo cada 1ms siendo esta la resolución máxima del Timer.... no vas a conseguir mucho. Tengo un amiguete :D que tuvo un problema similar y creo que lo resolvió porque encontró unos componentes freeware en los que se incluía un Timer de mayor precisión y resolución.

Espero haberte ayudado en algo e intentaré ponerme en contacto con mi amigo para ver si te puedo conseguir el nombre de dichos componentes el Lunes.

Saludos a todos!

Neftali [Germán.Estévez]
15-10-2004, 18:22:11
Prueba con algunos de los que hay en ésta página:

http://swiss.torry.net/timers.htm (Timers)

* HighResTimer v.1.02
* HPCounter v.1.1
* HPTimer v.1.2
* TSuperTimer v.1.0.2
* Tztimer v.1.00

Sonic
18-10-2004, 08:37:31
Vaya!

Parece que se me han "BIENadelantado". Muchas gracias Netfalí espero que con eso sea suficiente para israelgs.

Saludos a todos!

OSKR
21-12-2004, 21:55:45
Quita el Sleep()
Quita el Application->ProcessMessages();
Puedes hacer esto
while(true)
Memo1->AddLines(Now().FormatString("hh:nn:ss zzz"));
si por el contrario es muy rapido escribeme bgracso@hotmail.com




OSKR

Crandel
21-12-2004, 23:46:27
Yo estuve probando ya hace un tiempo de lograr una presicion un poco mayor y lo logre.
El TTimer no sirve cuando se necesita exactitud.
El punto es que Windows 98 trabaja con esa resolución. Por lo que cualquier componente de tiempo siempre va a tener une error superior a ese.
Los mejores timers que encontre son los de Indy, te los recomiendo.
Pero no el componente sino las funciones y clases que vienen con él. Especialmente StartCount(), JCLTimer y TJclMultiMediaTimer.
Proba con los 3 y quedate con lo que mas te guste

Suerte

Crandel