Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-11-2013
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 24-11-2013
WkaymQ48 WkaymQ48 is offline
Miembro
NULL
 
Registrado: jul 2012
Posts: 43
Poder: 0
WkaymQ48 Va por buen camino
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;
Responder Con Cita
  #3  
Antiguo 25-11-2013
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
¿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
   ...
Responder Con Cita
  #4  
Antiguo 28-11-2013
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
Ok Gracias, voy hacer varias pruebas y te comento como me fue. saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
optimizar el codigo en menos lineas darkbits Varios 5 19-07-2013 13:32:40
optimizar el codigo para no tener lo mismo mas de 5 veces en el proyecto darkbits Varios 6 28-10-2012 02:28:05
Ayuda como Optimizar Código JerS OOP 3 24-06-2011 05:59:44
optimizar codigo acrophet Varios 5 16-01-2011 23:28:39
Optimizar el sgte codigo BlueSteel Varios 9 14-08-2007 22:33:24


La franja horaria es GMT +2. Ahora son las 18:09:20.


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
Copyright 1996-2007 Club Delphi