Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Optimizar codigo (https://www.clubdelphi.com/foros/showthread.php?t=84694)

n03l 23-11-2013 15:17:57

Optimizar codigo
 
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
Código Delphi [-]
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

Código Delphi [-]
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:
Código Delphi [-]
     Application.ProcessMessages;
     while (FrmPrincipal.resp<>'') do

Es ahi donde esta el problema, ya que debería ser algo así:
Código Delphi [-]
     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.
Código Delphi [-]

   // 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:
Código Delphi [-]
   // 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:
Código Delphi [-]
   // 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


La franja horaria es GMT +2. Ahora son las 12:49:29.

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