[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