Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Como refrescar el form (https://www.clubdelphi.com/foros/showthread.php?t=60125)

rauros 21-09-2008 11:43:28

Como refrescar el form
 
Saludos. Tengo el siguiente problema. Quiero refrescar el form mientras activo el windows.beep (por ejemplo) para ver cuanto queda para que acabe el sonido. Pero solo se ve la barra de progreso en 0 cuando empieza y en 100 cuando acaba. Gracias a todos.

dec 21-09-2008 17:01:12

Hola,

Lo que puede estar ocurriendo es que una determinada tarea de tu aplicación está ocupando toda la cuota del procesador, si se puede decir así, de modo que la interfaz de tu aplicación "no responde", o se queda medio "congelada". Ante esto (hasta donde yo llego) se pueden tratar de hacer al menos dos cosas.

La primera es separar aquella tarea que está ocasionando que nuestra aplicación se "congele", separarla, digo, en un hilo diferente. Pero esto implica trabajar con hilos, precisamente, y me temo que no soy yo el más adecuado para decir nada más, sino que es menester tener ciertas cuestiones en mente cuando se trabaja así.

La segunda, que puede utilizarse en según qué casos (un buen número de ellos) es utilizar la popular instrucción "Application.ProcessMessages()"; De este modo nuestra aplicación se tomará un respiro, procesará los mensajes que tenga pendientes (también para su interfaz de usuario) y acaso solucione sin más el problema.

Ahora bien, esto último suele usarse en "bucles", por ejemplo, tal que así:

Código Delphi [-]
for i := 0 to j-1 do begin
  // Tarea más o menos "pesada" aquí

  Application.ProcessMessages();
end;

No sé si podrías tú utilizar algo así en tu aplicación o qué te vendría mejor. A lo mejor a algún otro compañero se le ocurre otra cosa que decirte. ;)

cHackAll 21-09-2008 23:53:07

Solo para ejemplificar lo ya dicho por Dec;

Código Delphi [-]
function Thread(dwValue: Cardinal): Cardinal; stdcall;
begin
 Windows.Beep(Word(dwValue), dwValue shr 16);
end;
 
function Beep(wFreq, wDuration: Word): Cardinal;
begin
 Result := CreateThread(nil, 0, @Thread, Ptr(wFreq or (wDuration shl 16)), 0, PDWORD(0)^);
end;

Si el caso es usar Beep, desarrollo la idea;

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 Beep(100, 1000); // La aplicacion no espera la conclusión de la API
end;
 
procedure TForm1.Button2Click(Sender: TObject); // Una posible solución
var hBeep: Cardinal;
begin
 Timer1.Enabled := True;
 hBeep := Beep(1000, 3000);
 while LongBool(WaitForSingleObject(hBeep, 10)) do
  Application.ProcessMessages;
 Timer1.Enabled := False;
end;
 
procedure TForm1.Button3Click(Sender: TObject); // falla en ~10% de tiempo
begin
 ProgressBar1.Max := 40;
 ProgressBar1.Position := 0;
 Beep(500, ProgressBar1.Max * 100);
 while ProgressBar1.Position < ProgressBar1.Max do
  begin
   ProgressBar1.Position := ProgressBar1.Position + 1;
   Application.ProcessMessages;
   Sleep(100);
  end;
end;

El anterior "Beep" modificado solo produce sonidos con duración máxima de 65.5 segundos y una milesima de exactitud, la siguiente dura hasta 10.9 minutos con una centesima de exactitud;

Código Delphi [-]
function Thread(dwValue: Cardinal): Cardinal; stdcall;
begin
 Windows.Beep(Word(dwValue), (dwValue shr 16) * 10);
end;
 
function Beep(wFreq: Word; wDuration: Cardinal): Cardinal;
begin
 Result := CreateThread(nil, 0, @Thread, Ptr(wFreq or ((wDuration div 10) shl 16)), 0, PDWORD(0)^);
end;

Saludos


La franja horaria es GMT +2. Ahora son las 00:48:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi