Introducción:
Pues eso... una función (o método) para esperar el número de segundos indicados.
La cantidad de segundos puede ser fraccionaria, pero no esperes demasiada precisión, ya que no
está pensada para que sea muy exacta, pero al tener decimales, te permitirá no tener que hacer
pausas de segundo en segundo, que es en realidad lo que yo iba buscando cuando la codifiqué.
El código que te voy a mostrar es válido para las versiones de .NET Framework 2.0 o superior,
en el caso de que uses una versión anterior, (al menos en Visual Basic), tendrás que usar
métodos que hagan la comparación de qué valor es mayor.
En ese código (tanto para Visual Basic como para Visual C#)
te muestro el método WaitSeconds y el método Main de una aplicación de consola que
lo usa para que veas cómo usarlo... (valga la redundancia), aunque no es complicado, ya que solo
hay que pasarle un valor Double con el lapso en segundos a esperar, por ejemplo
WaitSeconds(1.5) para esperar un segundo y medio.
(En una de las versiones que uso, en vez de usar Double usé Decimal, pero para el
caso es casi lo mismo, ya que el "truco" está en convertir los segundos indicados en una cadena
para asignar a un tipo de datos de tipo TimeSpam.)
Espero que te sea de utilidad.
Nos vemos.
Guillermo
Nota:
Si quieres ver una función parecida para Visual Basic 6.0, mira la colaboración de mi amigo Joe
LeVasseur: Timer y Medianoche, publicado el 9 de
Febrero de 1997 (sí, más de 10 años, por tanto, era para el VB4/VB5)
El código para Visual Basic .NET (Visual Basic 2005 o superior)
Module Module1
Sub Main()
Dim d1, d2 As DateTime
Dim d As Double
Dim segundos() As Double = {1.5, 2.3, 1.25, 2.99}
For i As Integer = 0 To segundos.Length - 1
d = segundos(i)
Console.WriteLine("Esperando... {0} segundos", d)
d1 = DateTime.Now
WaitSeconds(d)
d2 = DateTime.Now
Console.WriteLine("Inicio: {0}", d1.ToString("HH:mm:ss.ff"))
Console.WriteLine("final : {0}", d2.ToString("HH:mm:ss.ff"))
Console.WriteLine(" {0}", (d2 - d1).TotalSeconds.ToString("0.00"))
Console.WriteLine()
Next
Console.ReadLine()
End Sub
Private Sub WaitSeconds(ByVal nSecs As Double)
' Esperar los segundos indicados
' Crear la cadena para convertir en TimeSpan
Dim s As String = "0.00:00:" & nSecs.ToString.Replace(",", ".")
Dim ts As TimeSpan = TimeSpan.Parse(s)
' Añadirle la diferencia a la hora actual
Dim t1 As DateTime = DateTime.Now.Add(ts)
' Esta asignación solo es necesaria
' si la comprobación se hace al principio del bucle
Dim t2 As DateTime = DateTime.Now
' Mientras no haya pasado el tiempo indicado
Do While t2 < t1
' Un respiro para el sitema
System.Windows.Forms.Application.DoEvents()
' Asignar la hora actual
t2 = DateTime.Now
Loop
End Sub
End Module
El código para C# (Visual C# 2005 o superior)
class Program
{
static void Main(string[] args)
{
DateTime d1, d2;
double d;
double[] segundos = { 1.5, 2.3, 1.25, 2.99 };
for(int i = 0; i < segundos.Length; i++)
{
d = segundos[i];
Console.WriteLine("Esperando... {0} segundos", d);
d1 = DateTime.Now;
WaitSeconds(d);
d2 = DateTime.Now;
Console.WriteLine("Inicio: {0}", d1.ToString("HH:mm:ss.ff"));
Console.WriteLine("final : {0}", d2.ToString("HH:mm:ss.ff"));
Console.WriteLine(" {0}", (d2 - d1).TotalSeconds.ToString("0.00"));
Console.WriteLine();
}
Console.ReadLine();
}
private static void WaitSeconds(double nSecs)
{
// Esperar los segundos indicados
// Crear la cadena para convertir en TimeSpan
string s = "0.00:00:" + nSecs.ToString().Replace(",", ".");
TimeSpan ts = TimeSpan.Parse(s);
// Añadirle la diferencia a la hora actual
DateTime t1 = DateTime.Now.Add(ts);
// Esta asignación solo es necesaria
// si la comprobación se hace al principio del bucle
DateTime t2 = DateTime.Now;
// Mientras no haya pasado el tiempo indicado
while(t2 < t1)
{
// Un respiro para el sitema
System.Windows.Forms.Application.DoEvents();
// Asignar la hora actual
t2 = DateTime.Now;
}
}
}
Espacios de nombres usados en el código de este artículo:
System.Windows.Forms (para el DoEvents)