[Lazarus-es] [Fpc] Refresh no funciona

Maxi maximiliano.duarte en gmail.com
Jue Ago 6 17:34:33 CEST 2015


hice una prueba
Programe un arduino que lea un canal analogico cada 10ms y lo transmite a
115200 baudios y el mismo sin delay, lo que tarda la conversion del canal,
aproximadamentes 20us mas la conversion a string deben ser unos 5ms

Te arme 2 videos donde muestra como resfresca sin dramas.
10ms
https://youtu.be/A1Lbltaleko

sin delay
https://youtu.be/SWGooaCWVYM


unit pruserial;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LazSerial, Forms, Controls, Graphics,
Dialogs,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    LazSerial1: TLazSerial;
    procedure Button1Click(Sender: TObject);
    procedure LazSerial1RxData(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  LazSerial1.Open;
end;

procedure TForm1.LazSerial1RxData(Sender: TObject);
begin
     Edit1.Text:= LazSerial1.ReadData;

end;

end.

El 5 de agosto de 2015, 20:54, Martin Gomez <mmgomez en gmail.com> escribió:

> Con el Sincronize(UpdPeso) tampoco? Eso debería aislarte del
> multithreading interno de LazSerial (si es que tiene)
>
> 2015-08-05 13:54 GMT-03:00 francisco prieto <fajprieto en gmail.com>:
>
>> En primer lugar gracias a todos por responder...
>>
>> En segundo lugar el proceso monitorea con LazSerial el peso en una
>> balanza que escupe muy rapido cada lectura.
>>
>> En tercer lugar como dije hice el proceso de comunicacion utilizando el
>> evento OnRxData y si envio la data que recibo a un ListBox funciona sin
>> inconvenientes...
>>
>> El siguiente es el codigo que funciona contra el ListBox.
>>
>> procedure TfrmCheck.olePuertoRxData(Sender: TObject);
>> var
>>   lcLecturaReal,lcLetra:string;
>>   i:integer;
>> begin
>>      lcLecturaReal:=  olePuerto.ReadData;
>>        for i := 1 to Length(lcLecturaReal) do
>>           begin
>>              lcLetra:=InttoHex(Ord(lcLecturaReal[i]),2);
>>              lcLecturaHex := lcLecturaHex + lcLetra+ ' ';
>>              case lcLetra of
>>                   '30'..'39':
>>                   begin
>>                        lcLetra:=RightStr(lcLetra,1);
>>                        lcLecturaTotal := lcLecturaTotal + lcLetra;
>>                   end;
>>                   '0D':
>>                   begin
>>                      lcLecturaTotal := lcLecturaTotal + 'CR';
>>                      if (cboBalanza.KeyValue=1) then
>>                         begin
>>                           lcLecturaTotal := lcLecturaTotal +'LF';
>>                           if chkAuditaCom.Checked=True then
>>                             UpdLog(lcLecturaTotal);
>>                           lstTrama.Items.Add(lcLecturaTotal);
>>                           lcLecturaTotal:='';
>>                         end;
>>                   end;
>>                   '0A':
>>                   begin
>>                        lcLecturaTotal := lcLecturaTotal +'LF';
>>                        if chkAuditaCom.Checked=True then
>>                          UpdLog(lcLecturaTotal);
>>                        lstTrama.Items.Add(lcLecturaTotal);
>>                        lcLecturaTotal:='';
>>                   end;
>>              else
>>                 begin
>>                      if (lcLetra='02') and (Length(lcLecturaTotal)>0) then
>>                        begin
>>                          if chkAuditaCom.Checked=True then
>>                            UpdLog(lcLecturaTotal);
>>                          lstTrama.Items.Add(lcLecturaTotal);
>>                          lcLecturaTotal:='';
>>                        end;
>>                      if (lcLetra='02') then
>>                         lcLetra:='STX'
>>                      else
>>                         lcLetra:='|'+lcLetra+'|';
>>                      lcLecturaTotal := lcLecturaTotal + lcLetra;
>>                 end;
>>              end;
>>           end;
>>          if chkAuditaCom.Checked=True then
>>             UpdLog(lcLecturaHex);
>>          edtRecepcion.Lines.Add(lcLecturaHex);
>> end;
>>
>> Es mas si revisan hay un listbox y un memo recibiendo la info al mismo
>> tiempo... pero claro la info en esta instancia no se analiza porque es un
>> simple programa de comunicacion para comprobar que la comunicacion
>> funciona...
>>
>> Ahora bien ese mismo metodo lo repeti en la pantalla que debe analizar la
>> trama y cambia a esto otro
>>
>> procedure TfrmPesaje.olePuertoRxData(Sender: TObject);
>> var
>>   lcLecturaReal,lcLecturaHex,lcLecturaTotal,lcLetra:string;
>>   i:integer;
>> begin
>>   lcLecturaHex:='';
>>   lcLecturaTotal:='';
>>   lcLecturaReal:=  olePuerto.ReadData;
>>     for i := 1 to Length(lcLecturaReal) do
>>        begin
>>           lcLetra:=InttoHex(Ord(lcLecturaReal[i]),2);
>>           lcLecturaHex := lcLecturaHex + lcLetra+ ' ';
>>           case lcLetra of
>>                '30'..'39':
>>                begin
>>                     lcLetra:=RightStr(lcLetra,1);
>>                     lcLecturaTotal := lcLecturaTotal + lcLetra;
>>                end;
>>                '0D':
>>                begin
>>                   lcLecturaTotal := lcLecturaTotal + 'CR';
>>                   if (cboBalanza.KeyValue=1) then
>>                      begin
>>                        lcLecturaTotal := lcLecturaTotal +'LF';
>>                        if llAuditaCom=True then
>>                          UpdLog(lcLecturaTotal);
>>                        UpdPeso(lcLecturaTotal);
>>                        lcLecturaTotal:='';
>>                      end;
>>                end;
>>                '0A':
>>                begin
>>                     lcLecturaTotal := lcLecturaTotal +'LF';
>>                     if llAuditaCom=True then
>>                       UpdLog(lcLecturaTotal);
>>                     UpdPeso(lcLecturaTotal);
>>                     lcLecturaTotal:='';
>>                end;
>>           else
>>              begin
>>                   if (lcLetra='02') and (Length(lcLecturaTotal)>0) then
>>                     begin
>>                       if llAuditaCom=True then
>>                         UpdLog(lcLecturaTotal);
>>                       UpdPeso(lcLecturaTotal);
>>                       lcLecturaTotal:='';
>>                     end;
>>                   if (lcLetra='02') then
>>                      lcLetra:='STX'
>>                   else
>>                      lcLetra:='|'+lcLetra+'|';
>>                   lcLecturaTotal := lcLecturaTotal + lcLetra;
>>              end;
>>           end;
>>        end;
>>       if llAuditaCom=True then
>>          UpdLog(lcLecturaHex);
>> end;
>>
>> Si revisan el cambio es minimo ya que en vez de agregar la lectura al
>> ListBox o al Memo, envio la lectura como argumento al UpdPeso
>>
>> Y UpdPeso funciona sin inconveniente, cuyo codigo es el siguiente:
>>
>>
>> procedure TfrmPesaje.UpdPeso(cLectura:String);
>> var
>>   lcTramas:TStringList;
>>
>> lnIndice,lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer;
>>
>> lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales,lcLectura:string;
>> begin
>>   lcEstadoA:='';
>>   lcEstadoB:='';
>>   lcEstadoC:='';
>>   lcPeso:='';
>>   lcTara:='';
>>   lcTramas:= TStringList.Create;
>>   Split('|', cLectura, lcTramas);
>>   lnCantTramas:=lcTramas.count;
>>   if lnCantTramas=5 then
>>      begin
>>        lcEstadoA:=lcTramas.Strings[1];
>>        lcEstadoB:=lcTramas.Strings[2];
>>        lcEstadoC:=lcTramas.Strings[3];
>>        lcPeso:=copy(lcTramas.Strings[4],1,6);
>>        lcTara:=copy(lcTramas.Strings[4],7,6);
>>        {Analisis Estado A}
>>        lcEstadoA:=HextoBin(lcEstadoA);
>>        lcDecimales:=copy(lcEstadoA,6,3);
>>        case lcDecimales of
>>             '010':lnPesoComa:=0;
>>             '011':lnPesoComa:=1;
>>             '100':lnPesoComa:=2;
>>             '101':lnPesoComa:=3;
>>             '110':lnPesoComa:=4;
>>        else
>>             lnPesoComa:=0;
>>        end;
>>        {Analisis Estado B}
>>        lcEstadoB:=HextoBin(lcEstadoB);
>>        lnNeto:=StrToInt(copy(lcEstadoB,8,1));
>>        lnNegativo:=StrToInt(copy(lcEstadoB,7,1));
>>        lnFueraRango:=StrToInt(copy(lcEstadoB,6,1));
>>        lnFueraEqui:=StrToInt(copy(lcEstadoB,5,1));
>>        {Analisis Estado C}
>>        lcEstadoC:=HextoBin(lcEstadoC);
>>        lnTeclaAd:=StrToInt(copy(lcEstadoB,5,1));
>>        {Calculos Finales}
>>        lnPesoTara:=StrToInt(lcTara)/(Exp(LN(10)*lnPesoComa));
>>        lnPesoTot:=StrToInt(lcPeso)/(Exp(LN(10)*lnPesoComa));
>>        if lnNegativo=1 then
>>           lnPesoTot:=lnPesoTot*(-1);
>>       end;
>> end;
>>
>> El valor que quiero mostrar se almacena en la propiedad del formulario
>> lnPesoTot,
>>
>> Entiendo que con este link
>> http://wiki.freepascal.org/Multithreaded_Application_Tutorial/es
>> debería  implementar un hilo con el procedimiento UpdPeso, o quizas un
>> hilo que sea llamado desde el procedimiento UpdPeso.
>>
>> Hasta ahora por mas que lo estudio no logro entender como se hace eso,
>> porque entiendo que mi caso es este...
>>
>> Type
>>     TForm1 = class(TForm)
>>       Button1: TButton;
>>       Label1: TLabel;
>>       procedure FormCreate(Sender: TObject);
>>       procedure FormDestroy(Sender: TObject);
>>     private
>>       { private declarations }
>>       MyThread: TMyThread;
>>       procedure ShowStatus(Status: string);
>>     public
>>       { public declarations }
>>     end;
>>
>>   procedure TForm1.FormCreate(Sender: TObject);
>>   begin
>>     inherited;
>>     MyThread := TMyThread.Create(true);
>>     MyThread.OnShowStatus := @ShowStatus;
>>   end;
>>
>>   procedure TForm1.FormDestroy(Sender: TObject);
>>   begin
>>     MyThread.Terminate;
>>     MyThread.Free;
>>     inherited;
>>   end;
>>
>>   procedure TForm1.Button1Click(Sender: TObject);
>>   begin
>>    MyThread.Resume;
>>   end;
>>
>>   procedure TForm1.ShowStatus(Status: string);
>>   begin
>>     Label1.Caption := Status;
>>   end;
>>
>> Pero no se si Deberia reemplazar ShowStatus por UpdPeso y MyThread.Resume colocarlo en el lugar en que coloco UpdPeso...
>>
>> Voy a probar asi, ya que ningun otro consejo me dio resultado.
>>
>> Saludos y los mantengo al tanto.
>>
>> Pancho
>>
>> Córdoba
>>
>> Argentina
>>
>>
>>
>> El 5 de agosto de 2015, 13:04, Daniel Sánchez <resetsoftware en gmail.com>
>> escribió:
>>
>>> Lo que comentas es al parecer que cuando pierde el foco el formulario en
>>> tu caso llamando a showmessage y vuelve es cuando se muestra el dato, en
>>> todo caso haz un deactivate/activate en tu formulario para que dispare el
>>> evento refresh del mismo o en todo caso invoca el refresh del formulario.
>>> Otra cosa después de actualizar tu text y te posicionas en el con el mouse
>>> o el teclado sigue sin mostrar tus datos nuevos o sigue mostrando los datos
>>> anteriores.
>>>
>>> Saludos
>>>
>>> El 4 de agosto de 2015, 11:30, francisco prieto <fajprieto en gmail.com>
>>> escribió:
>>>
>>>> Tengo el siguiente código
>>>>
>>>> procedure TfrmPesaje.UpdPeso(cLectura:String);
>>>> var
>>>>   lcTramas:TStringList;
>>>>
>>>> lnIndice,lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer;
>>>>
>>>> lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales,lcLectura:string;
>>>> begin
>>>>   lcEstadoA:='';
>>>>   lcEstadoB:='';
>>>>   lcEstadoC:='';
>>>>   lcPeso:='';
>>>>   lcTara:='';
>>>>   lcTramas:= TStringList.Create;
>>>>   Split('|', cLectura, lcTramas);
>>>>   lnCantTramas:=lcTramas.count;
>>>>   if lnCantTramas=5 then
>>>>      begin
>>>>        lcEstadoA:=lcTramas.Strings[1];
>>>>        lcEstadoB:=lcTramas.Strings[2];
>>>>        lcEstadoC:=lcTramas.Strings[3];
>>>>        lcPeso:=copy(lcTramas.Strings[4],1,6);
>>>>        lcTara:=copy(lcTramas.Strings[4],7,6);
>>>>        {Analisis Estado A}
>>>>        lcEstadoA:=HextoBin(lcEstadoA);
>>>>        lcDecimales:=copy(lcEstadoA,6,3);
>>>>        case lcDecimales of
>>>>             '010':lnPesoComa:=0;
>>>>             '011':lnPesoComa:=1;
>>>>             '100':lnPesoComa:=2;
>>>>             '101':lnPesoComa:=3;
>>>>             '110':lnPesoComa:=4;
>>>>        else
>>>>             lnPesoComa:=0;
>>>>        end;
>>>>        {Analisis Estado B}
>>>>        lcEstadoB:=HextoBin(lcEstadoB);
>>>>        lnNeto:=StrToInt(copy(lcEstadoB,8,1));
>>>>        lnNegativo:=StrToInt(copy(lcEstadoB,7,1));
>>>>        lnFueraRango:=StrToInt(copy(lcEstadoB,6,1));
>>>>        lnFueraEqui:=StrToInt(copy(lcEstadoB,5,1));
>>>>        {Analisis Estado C}
>>>>        lcEstadoC:=HextoBin(lcEstadoC);
>>>>        lnTeclaAd:=StrToInt(copy(lcEstadoB,5,1));
>>>>        {Calculos Finales}
>>>>        lnPesoTara:=StrToInt(lcTara)/(Exp(LN(10)*lnPesoComa));
>>>>        lnPesoTot:=StrToInt(lcPeso)/(Exp(LN(10)*lnPesoComa));
>>>>        if lnNegativo=1 then
>>>>           lnPesoTot:=lnPesoTot*(-1);
>>>>        {Actualizo campo de Peso Actual}
>>>>        txtPesoAct.Text:=FloatToStr(lnPesoTot);
>>>>        txtPesoAct.Refresh;
>>>>        application.ProcessMessages;
>>>>      end;
>>>>
>>>> Que se ejecuta por cada lectura del puerto serie.
>>>>
>>>> txtPesoAct es una caja de texto en la cual pongo el peso de la balanza.
>>>>
>>>> Si solo hago el Refresh no se refresca el control...
>>>> Si le agrego application.ProcessMessages tampoco se refresca el control.
>>>>
>>>> El control solo se refresca cuando hago un showmessage desde otro
>>>> control.
>>>>
>>>> Tengo otra pantalla que tiene un codigo similar pero el que recibe la
>>>> info es una lista, en ese caso funciona sin inconvenientes...
>>>>
>>>> Espero sus comentarios.
>>>>
>>>> Pancho
>>>> Córdoba
>>>> Argentina
>>>>
>>>> --
>>>> Has recibido este mensaje porque estás suscrito al grupo
>>>> "comunidad-hispana-freepascal" de Grupos de Google.
>>>> Para anular la suscripción a este grupo y dejar de recibir sus
>>>> mensajes, envía un correo electrónico a
>>>> freepascalhispano+unsubscribe en googlegroups.com.
>>>> Para ver esta conversación en el sitio web, visita
>>>> https://groups.google.com/d/msgid/freepascalhispano/CAB6XyW1o82vA9sBAtO0LW48Q6qk84jBD9PJFrWXyNJk_datp1w%40mail.gmail.com
>>>> <https://groups.google.com/d/msgid/freepascalhispano/CAB6XyW1o82vA9sBAtO0LW48Q6qk84jBD9PJFrWXyNJk_datp1w%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>> .
>>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>>>
>>>
>>>
>>>
>>> --
>>> Daniel Sánchez Escobar
>>> Investigación y Desarrollo
>>> Reset Software & Sistemas
>>> Móvil +051-949398047 RPM #948615385
>>> Trujillo - Perú
>>>
>>> P  Sugerimos no imprimir este e-mail a menos que sea absolutamente
>>> necesario. Protejamos el medio ambiente.
>>>
>>> --
>>> Has recibido este mensaje porque estás suscrito al grupo
>>> "comunidad-hispana-freepascal" de Grupos de Google.
>>> Para anular la suscripción a este grupo y dejar de recibir sus mensajes,
>>> envía un correo electrónico a
>>> freepascalhispano+unsubscribe en googlegroups.com.
>>> Para ver esta conversación en el sitio web, visita
>>> https://groups.google.com/d/msgid/freepascalhispano/CA%2BEDH_V%3DY2gOs66FZKPtHzCW6rhuyW-29z2rkosiMR5eB0r3-Q%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/freepascalhispano/CA%2BEDH_V%3DY2gOs66FZKPtHzCW6rhuyW-29z2rkosiMR5eB0r3-Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>>
>>
>>
>> _______________________________________________
>> Lazarus-es mailing list
>> Lazarus-es en lists.lazarus.freepascal.org
>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>>
>>
>
>
> --
>> Most good programmers do programming not because they expect to get paid
> or get adulation by the public, but because it is fun to program.
> ​ ​
> *Linus Torvalds*
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>
>


-- 
El que pregunta aprende, y el que contesta aprende a responder.

No a la obsolecencia programada:
http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml

Linux User #495070
http://domonetic.com/blog
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20150806/4b15b935/attachment-0002.html>


More information about the Lazarus-es mailing list