PDA

Ver la Versión Completa : Como evitar que mis aplicaciones se "cuelguen"


Gaim2205
20-05-2008, 01:59:47
Trabajo con delphi 7. La mayoría de las aplicaciones que tengo que programar acceden a servidores y/o equipos remotos. Al ejecutar algun query un poco "grande" o no se.... al copiar un achivo con CopyFile de un directorio remoto a otro, mis aplicaciones se "cuelgan" mientras trabajan y ésto le da al usuario la impresión de que ha habido algun fallo.

Hay alguna forma de evitar esto? Gracias por su ayuda....

cHackAll
20-05-2008, 02:04:38
Revisa éste (http://www.clubdelphi.com/foros/showthread.php?t=55194) hilo.

paladincubano
20-05-2008, 13:48:43
Para evitar eso. Usa como bien te dicen el

Application.ProcessMessage;

Ahora, cuando usas el CopyFile, si son muchos ficheros en un ciclo, pones esa instruccion dentro del ciclo y puedes hasta usar un progressBar, peroooooooo, si el archivo es muy grande, veras la misma sensacion de cuelgue porque dentro del Procedimiento CopyFile no hacen ese procedimiento. Para evitar eso creo que deberias hacer tu mismo un copyfile, hay miles de ejemplo de como copiar ficheros uno mismo. (Para mi es mejor porque lo controlo todo desde el mismo programa y manejo mucho mejor el progressbar)
Suerte.

Gaim2205
20-05-2008, 16:54:39
Sacado de las páginas de Torry


procedure TForm1.Cargar(Source, Destination: string);
var
FromF, ToF: file of byte;
Buffer: array[0..4096] of char;
NumRead: integer;
FileLength: longint;
begin
AssignFile(FromF, Source);
reset(FromF);
AssignFile(ToF, Destination);
rewrite(ToF);
FileLength := FileSize(FromF);
with Progressbar1 do
begin
Min := 0;
Max := FileLength;
while FileLength > 0 do
begin
BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
FileLength := FileLength - NumRead;
BlockWrite(ToF, Buffer[0], NumRead);
Position := Position + NumRead;
end;
CloseFile(FromF);
CloseFile(ToF);
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Cargar('c:\Windows\Welcome.exe', 'c:\temp\Welcome.exe');
end;

paladincubano
20-05-2008, 18:08:12
No esta mal, pero hay metodos muchos mejores utilizando los Streams. Creo yo.

Gaim2205
21-05-2008, 17:11:53
Pues compártelos.

xEsk
21-05-2008, 17:21:30
Yo para tareas tediosas, que se que van a tardar un buen rato, suelo programarlas en un thread independiente, y luego advierto al usuario que se esta trabajando y debe esperar... Pero como la aplicación no esta "detenida" ya no da la sensación de que este colgada... y de paso le metes algún progress bar de estos infinitos (circulares).

Saludos.