PDA

Ver la Versión Completa : Optimizar codigo


n03l
23-11-2013, 15:17:57
Saludos, tengo un pequeño codigo que recorre una tabla y va enviando comandos a un dispositivo USB a traves del componente TComport.... el codigo que tengo me funsiona bien, ya que cada vez que envio un comando al disposivo USB hago una pausa de 10seg para esperar la respuesta del dispositivo.

el problema esque el tiempo de respuesta es variado es decir podria devolver la respuesta en 3eg o en 7seg y la manera como yo lo hago estoy perdiendo tiempo ya q espero 10seg para asegurar la respuesta q debo almacenar en una tabla

el codigo que uso es el siguiente

for I := 0 to FrmPrincipal.Tabla.RecordCount - 1 do
begin
FrmPrincipal.ComPort.WriteStr('ENVIO EL COMANDO A DISPOSITIVO USB');
Sleep(10000); // hago una pausa para esperar la respuesta del dispositivo
Application.ProcessMessages;

if FrmPrincipal.resp='ERROR' then
begin
FrmPrincipal.Tabla.Edit;
FrmPrincipal.Tabla.FieldByName('ESTADO').AsString:='ERROR';
FrmPrincipal.Tabla.Post;

end //fin resp error
else
if FrmPrincipal.resp='OK' then
begin
FrmPrincipal.Tabla.Edit;
FrmPrincipal.Tabla.FieldByName('ESTADO').AsString:='EXITO';
FrmPrincipal.Tabla.Post;

end; //fin resp ok

FrmPrincipal.Tabla.Next;
end;




Tambien e tratado de agregarle un while para de esta manera avanzar cuando se obtenga una respuesta pero no camina de esa forma


FrmPrincipal.resp:='';
for I := 0 to FrmPrincipal.Tabla.RecordCount - 1 do
begin
FrmPrincipal.ComPort.WriteStr('ENVIO EL COMANDO A DISPOSITIVO USB');
// Sleep(10000); // hago una pausa para esperar la respuesta del dispositivo
Application.ProcessMessages;
while (FrmPrincipal.resp<>'') do
begin
if FrmPrincipal.resp='ERROR' then
begin
FrmPrincipal.Tabla.Edit;
FrmPrincipal.Tabla.FieldByName('ESTADO').AsString:='ERROR';
FrmPrincipal.Tabla.Post;

end //fin resp error
else
if FrmPrincipal.resp='OK' then
begin
FrmPrincipal.Tabla.Edit;
FrmPrincipal.Tabla.FieldByName('ESTADO').AsString:='EXITO';
FrmPrincipal.Tabla.Post;

end; //fin resp ok
end;//fin de while

FrmPrincipal.Tabla.Next;
end;


aver si alguien me echa una manito para optimizar este codigo. saludos

WkaymQ48
24-11-2013, 01:00:11
Si esto no es una errata al escribir el mensaje:

Application.ProcessMessages;
while (FrmPrincipal.resp<>'') do


Es ahi donde esta el problema, ya que debería ser algo así:

while (FrmPrincipal.resp<>'') do
Application.ProcessMessages;

duilioisola
25-11-2013, 18:37:37
¿Qué significa "pero no camina de esa forma"?
Si el problema es que recibe, por ejemplo, solo parte del mensaje, podrías esperar un poco después de recibir la primera parte.


// Espero a que llegue algo máximo 10 segundos
segundos := 10;
while ((FrmPrincipal.resp <> '') and (Segundos > 0))do
begin
Sleep(1000);
dec(Segundos);
Application.ProcessMessages;
end;

if (Segundos = 0) then
// Error
...
else
// Proceso el mensaje
...


Otra opción revisar la respuesta cada segundo:

// Espero a que llegue algo
while (FrmPrincipal.resp <> '') do
Application.ProcessMessages;
// Espero un poco más suponiendo que solo llegó la primera parte de la respuesta
Sleep(100);

// Proceso el mensaje
...


Según vi en algún lugar creo que el componente informa cuantos Bytes ha leido.
Podrías esperar hasta que este valor sea mayor que 0. Luego esperas un poco mas para asegurarte de que llega el mensaje completo y luego haces la lectura:

// Espero a que llegue algo
while (FrmPrincipal.ComPort.InputCount = 0) do
Application.ProcessMessages;
// Espero un poco más suponiendo que solo llegó la primera parte de la respuesta
Sleep(100);

// Proceso el mensaje
...

n03l
28-11-2013, 21:07:11
Ok Gracias, voy hacer varias pruebas y te comento como me fue. saludos