Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2015-08

Refresh no funciona

32 messages · 6 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

francisco prieto

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
------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150804/c7c57435/attachment.html>

Reply by email

Martin Gomez
to francisco prieto

Tocando de o�do, quizas puedas forzar un repintado con Invalidate() (en Delphi funcionaba)

2015-08-04 13:30 GMT-03:00 francisco prieto <fajprieto en gmail.com>:

Show quoted text 80 lines
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 _______________________________________________ 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* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150804/d9d7ce33/attachment.html>

Reply by email

francisco prieto
to Martin Gomez

Martin,

Sigue sin responder...

Pero ojo vi que lo que no se refresca es el valor porque si cambias por ejemplo de enabled a disabled funciona...

Ya probe con

Refresh
Repaint
Update
Invalidate

e incluso agregue un timer que haga el refresco independientemente si cambia el valor o no.

He podido comprobar que si pongo un showmessage y en modo debug funciona... pero si le quito el modo debug hasta que no le doy showmessage desde otro campo no se actualiza el valor.

Probe incluso con el Texout de canvas y NO ANDA... Hasta se me ocurrio ponerlo invisible y luego visible (ya que este es un error que da a veces en VFP y no anda de todos modos).

Alguna otra sugerencia?

Saludos,

Pancho
C�rdoba
Argentina

El 4 de agosto de 2015, 16:28, Martin Gomez <mmgomez en gmail.com> escribi�:

Show quoted text 101 lines
Tocando de o�do, quizas puedas forzar un repintado con Invalidate() (en Delphi funcionaba) 2015-08-04 13:30 GMT-03:00 francisco prieto <fajprieto en gmail.com>: > 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 > > _______________________________________________ > 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

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150804/91567781/attachment-0001.html>

Reply by email

Martin Gomez
to francisco prieto

Segun lo que recuerdo, Update era el mas "lento" pero el m�s seguro de los 4 que mencionas.
Esa funci�n que pegaste es directamente un evento? O es llamada desde el evento en s�?
En caso que sea una funci�n que llamas a mano, prob� mandar txtPesoAct.Update desde fuera, al salir... puede que el optimizador interprete que ah� no tenes acceso al GUI (ni idea realmente, pero as� lo tengo que hacer en C#, o llamar un delegate() que acceda a la parte gr�fica cuando quiero forzarlo)

2015-08-04 16:46 GMT-03:00 francisco prieto <fajprieto en gmail.com>:

Show quoted text 144 lines
Martin, Sigue sin responder... Pero ojo vi que lo que no se refresca es el valor porque si cambias por ejemplo de enabled a disabled funciona... Ya probe con Refresh Repaint Update Invalidate e incluso agregue un timer que haga el refresco independientemente si cambia el valor o no. He podido comprobar que si pongo un showmessage y en modo debug funciona... pero si le quito el modo debug hasta que no le doy showmessage desde otro campo no se actualiza el valor. Probe incluso con el Texout de canvas y NO ANDA... Hasta se me ocurrio ponerlo invisible y luego visible (ya que este es un error que da a veces en VFP y no anda de todos modos). Alguna otra sugerencia? Saludos, Pancho C�rdoba Argentina El 4 de agosto de 2015, 16:28, Martin Gomez <mmgomez en gmail.com> escribi�: > Tocando de o�do, quizas puedas forzar un repintado con Invalidate() (en > Delphi funcionaba) > > 2015-08-04 13:30 GMT-03:00 francisco prieto <fajprieto en gmail.com>: > >> 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 >> >> _______________________________________________ >> 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 > > _______________________________________________ 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* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150804/e4cc8a5b/attachment.html>

Reply by email

francisco prieto
to Martin Gomez

Bueno, un avance...

Si pongo esto en un timer

   {Actualizo campo de Peso Actual}
   txtPesoAct.Text:=Floattostr(lnPesoTot);

y muevo el mouse, el peso se actualiza...

Ahora probare de mover el mouse por programa... un pixel a ver si se actualiza...

Sigo investigando.

Saludos,

Pancho
C�rdoba
Argentina

El 4 de agosto de 2015, 17:15, Martin Gomez <mmgomez en gmail.com> escribi�:

Show quoted text 171 lines
Segun lo que recuerdo, Update era el mas "lento" pero el m�s seguro de los 4 que mencionas. Esa funci�n que pegaste es directamente un evento? O es llamada desde el evento en s�? En caso que sea una funci�n que llamas a mano, prob� mandar txtPesoAct.Update desde fuera, al salir... puede que el optimizador interprete que ah� no tenes acceso al GUI (ni idea realmente, pero as� lo tengo que hacer en C#, o llamar un delegate() que acceda a la parte gr�fica cuando quiero forzarlo) 2015-08-04 16:46 GMT-03:00 francisco prieto <fajprieto en gmail.com>: > Martin, > > Sigue sin responder... > > Pero ojo vi que lo que no se refresca es el valor porque si cambias por > ejemplo de enabled a disabled funciona... > > Ya probe con > > Refresh > Repaint > Update > Invalidate > > e incluso agregue un timer que haga el refresco independientemente si > cambia el valor o no. > > He podido comprobar que si pongo un showmessage y en modo debug > funciona... pero si le quito el modo debug hasta que no le doy showmessage > desde otro campo no se actualiza el valor. > > Probe incluso con el Texout de canvas y NO ANDA... Hasta se me ocurrio > ponerlo invisible y luego visible (ya que este es un error que da a veces > en VFP y no anda de todos modos). > > Alguna otra sugerencia? > > Saludos, > > Pancho > C�rdoba > Argentina > > El 4 de agosto de 2015, 16:28, Martin Gomez <mmgomez en gmail.com> escribi�: > >> Tocando de o�do, quizas puedas forzar un repintado con Invalidate() (en >> Delphi funcionaba) >> >> 2015-08-04 13:30 GMT-03:00 francisco prieto <fajprieto en gmail.com>: >> >>> 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 >>> >>> _______________________________________________ >>> 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 >> >> > > _______________________________________________ > 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

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150804/b90e548a/attachment-0001.html>

Reply by email

Jesus Reyes
to francisco prieto: Sigue sin responder... Pero ojo vi que lo que no se refresca es el valor porque si…

El mar 4-ago-15, francisco prieto <fajprieto en gmail.com> escribi�:

Show quoted text 30 lines
Martin, Sigue sin responder... Pero ojo vi que lo que no se refresca es el valor porque si cambias por ejemplo de enabled a disabled funciona... Ya probe con Refresh Repaint Update Invalidate e incluso agregue un timer que haga el refresco independientemente si cambia el valor o no. He podido comprobar que si pongo un showmessage y en modo debug funciona... pero si le quito el modo debug hasta que no le doy showmessage desde otro campo no se actualiza el valor. Probe incluso con el Texout de canvas y NO ANDA... Hasta se me ocurrio ponerlo invisible y luego visible (ya que este es un error que da a veces en VFP y no anda de todos modos). Alguna otra sugerencia?

No deber�a ser tan complicado, ni requerir de cosas sospechosas. Seguro algo esta por ah� fuera de lugar. A veces vale la pena dar un paso a tras e intentar otras cosas mas b�sicas. Por ejemplo, has tratado de reproducir el problema en un proyecto independiente? si es as�, publ�calo para intentarlo ac�. Si en un proyecto simple no se puede reproducir, puedes aislar la parte necesaria de la aplicaci�n para reproducir el problema y publicarla?

Que versi�n de Lazarus (y revisi�n) usas? y de FPC?. En que sistema operativo? compilando el programa en que widgetset?. Perd�n si pido datos que ya hayas especificado. Por cierto, con que frecuencia es llamado el metodo UpdPeso?, lnCantTramas es siempre 5?

Jesus Reyes A.

Reply by email

Iván gmail
to Jesus Reyes

Buenas.
A mi parecer el origen del problema debe ser la llamada de esa funci�n. Si est�s leyendo datos desde un puerto serie, es posible que la lectura se realice mediante un nuevo hilo, para no bloquear el hilo principal de la aplicaci�n mientras se reciben datos. Imagino que estar�s usando alg�n componente.
Para acceder a los elementos de la GUI desde un hilo que no es el principal, hay que usar Synchronize(m�todoqueaccedealaGUI) desde dentro del c�digo que controla el nuevo hilo.
Si est�s usando alg�n componente, tendr� alg�n mecanismo para que le pases una referencia de un m�todo que quieras ejecutar.

Otra soluci�n podr�a ser guardar en una variable public el peso en UpdPeso:
En lugar de txtPesoAct.Text := Float .... pones
PublicVar := Float....

Luego en un ontimer cada segundo puedes mirar si PublicVar tiene algo disinto de 0 y ponerlo en tu txtPesoAct.

Abrazos.

El 05/08/2015 a las 3:54, Jesus Reyes escribi�:

Show quoted text 43 lines
El mar 4-ago-15, francisco prieto <fajprieto en gmail.com> escribi�: > Martin, > > Sigue sin responder... > > Pero ojo vi que lo > que no se refresca es el valor porque si cambias por ejemplo > de enabled a disabled funciona... > > Ya probe con > > Refresh > Repaint > Update > Invalidate > > e incluso agregue un timer que haga > el refresco independientemente si cambia el valor o no. > > He podido comprobar > que si pongo un showmessage y en modo debug funciona... pero > si le quito el modo debug hasta que no le doy showmessage > desde otro campo no se actualiza el valor. > > Probe incluso con > el Texout de canvas y NO ANDA... Hasta se me ocurrio ponerlo > invisible y luego visible (ya que este es un error que da a > veces en VFP y no anda de todos modos). > > Alguna otra sugerencia? > No deber�a ser tan complicado, ni requerir de cosas sospechosas. Seguro algo esta por ah� fuera de lugar. A veces vale la pena dar un paso a tras e intentar otras cosas mas b�sicas. Por ejemplo, has tratado de reproducir el problema en un proyecto independiente? si es as�, publ�calo para intentarlo ac�. Si en un proyecto simple no se puede reproducir, puedes aislar la parte necesaria de la aplicaci�n para reproducir el problema y publicarla? Que versi�n de Lazarus (y revisi�n) usas? y de FPC?. En que sistema operativo? compilando el programa en que widgetset?. Perd�n si pido datos que ya hayas especificado. Por cierto, con que frecuencia es llamado el metodo UpdPeso?, lnCantTramas es siempre 5? Jesus Reyes A. _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Reply by email

Martin Gomez
to Iván gmail

2015-08-05 3:32 GMT-03:00 Iv�n gmail <iv.mesa.prg en gmail.com>:

Show quoted text 21 lines
Buenas. A mi parecer el origen del problema debe ser la llamada de esa funci�n. Si est�s leyendo datos desde un puerto serie, es posible que la lectura se realice mediante un nuevo hilo, para no bloquear el hilo principal de la aplicaci�n mientras se reciben datos. Imagino que estar�s usando alg�n componente. Para acceder a los elementos de la GUI desde un hilo que no es el principal, hay que usar Synchronize(m�todoqueaccedealaGUI) desde dentro del c�digo que controla el nuevo hilo. Si est�s usando alg�n componente, tendr� alg�n mecanismo para que le pases una referencia de un m�todo que quieras ejecutar. Otra soluci�n podr�a ser guardar en una variable public el peso en UpdPeso: En lugar de txtPesoAct.Text := Float .... pones PublicVar := Float.... Luego en un ontimer cada segundo puedes mirar si PublicVar tiene algo disinto de 0 y ponerlo en tu txtPesoAct. Abrazos.

?+1?

tiene que venir por ese lado.

? 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* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150805/199ea5c6/attachment.html>

Reply by email

Maxi
to Martin Gomez

he manejado en delphi ese tipo de comunicaciones y el refresco en normal, salvo que la lectura del serial sea muy repetida y no das tiempo a que se refresquen los datos que ya viene el nuevo. Si es de monitoreo conque llenes una variable como dice Martin y la muestres con 500ms sobra. Si usas un componente como lazserial, 5pdo, o CportLib (solo windows), tiene evento que se disparan al recibir datos.
Hay que ver si la balanza envia datos regualarmente o ante cambios. Igualmente compara si no hay cambios significativos no refrescas.

El 5 de agosto de 2015, 11:27, Martin Gomez <mmgomez en gmail.com> escribi�:

Show quoted text 46 lines
2015-08-05 3:32 GMT-03:00 Iv�n gmail <iv.mesa.prg en gmail.com>: > Buenas. > A mi parecer el origen del problema debe ser la llamada de esa funci�n. > Si est�s leyendo datos desde un puerto serie, es posible que la lectura > se realice mediante un nuevo hilo, para no bloquear el hilo principal de la > aplicaci�n mientras se reciben datos. Imagino que estar�s usando alg�n > componente. > Para acceder a los elementos de la GUI desde un hilo que no es el > principal, hay que usar Synchronize(m�todoqueaccedealaGUI) desde dentro del > c�digo que controla el nuevo hilo. > Si est�s usando alg�n componente, tendr� alg�n mecanismo para que le > pases una referencia de un m�todo que quieras ejecutar. > > Otra soluci�n podr�a ser guardar en una variable public el peso en > UpdPeso: > En lugar de txtPesoAct.Text := Float .... pones > PublicVar := Float.... > > Luego en un ontimer cada segundo puedes mirar si PublicVar tiene algo > disinto de 0 y ponerlo en tu txtPesoAct. > > Abrazos. > ?+1? tiene que venir por ese lado. -- ? 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.freepascal.org/pipermail/lazarus-es/attachments/20150805/09a0667e/attachment.html>

Reply by email

francisco prieto

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�:

Show quoted text 126 lines
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.

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150805/bc7c28f8/attachment-0001.html>

Reply by email

Maxi
to francisco prieto

Primero proba algo mas simple para descartar tiempos. Un simple edit y ver si refresca solo

edit.text:=  olePuerto.ReadData;

Como anecdota ten en cuenta que hay veces que se fracciona el buffer y van llegando mas datos despues de que se dispara el evento, me paso que en transmisiones quedaba 1 byte que llegaba despues.
Entonces despues de leer los bytes que esperaba recien procesaba. Se soluciona muchas veces ajustando el buffer a lo esperado.

El 5 de agosto de 2015, 13:54, francisco prieto <fajprieto en gmail.com> escribi�:

Show quoted text 394 lines
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
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.freepascal.org/pipermail/lazarus-es/attachments/20150805/2fce8ae0/attachment-0001.html>

Reply by email

Martin Gomez
to francisco prieto: En primer lugar gracias a todos por responder... En segundo lugar el proceso monitorea…

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>:

Show quoted text 394 lines
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* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150805/f5355536/attachment-0001.html>

Reply by email

Martin Gomez
to francisco prieto: En primer lugar gracias a todos por responder... En segundo lugar el proceso monitorea…

Con el Sincronize(UpdPeso) tampoco? Eso deber�a aislarte del multithreading interno de LazSerial (si es que tiene)

? 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* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150805/a0ce0b67/attachment.html>

Reply by email

francisco prieto
to Martin Gomez

Miren hice lo siguiente y aun presenta el mismo error...

1) Agregue un hilo

{ TMiHilo }

    TMiHilo = class(TThread)
    private
      fStatusText: string;
      procedure MostrarPeso;
    protected
      procedure Execute; override;
    public
      constructor Create(CreaSuspendido: boolean);
    end;

2) En la definicion del formulario coloque esta propiedad como publica

  public
    lnPesoTot:real;

3) Agregue los procedimientos de mi hilo

{ TMiHilo }
procedure TMiHilo.MostrarPeso;
begin
    frmPesaje.txtPesoAct.Text:=FloatToStr(frmPesaje.lnPesoTot);
    frmPesaje.txtPesoAct.Refresh;
end;
procedure TMiHilo.Execute;
var
  newStatus : string;
  aaa:string;
begin
  fStatusText := 'Ejecutando...';
  while (not Terminated) and (true) do begin
      sleep(2000);
      fStatusText := 'Mostrando Peso ...';
      Synchronize( @MostrarPeso );
  end;
end;
constructor TMiHilo.Create(CreaSuspendido: boolean);
begin
  FreeOnTerminate := True;
  inherited Create(CreaSuspendido);
end;

4) Agregue una variable en el procedimiento de mi formulario denomidado UpdPeso

MiHilo : TMiHilo;

para poder hacer referencia a mi hilo.

5) Finalmente agregue el siguiente codigo en el procedimiento UpdPeso

       //creamos el hilo, pero no lo iniciamos
       MiHilo := TMiHilo.Create(True); // Con el parametro true no se
inicia automaticamente
       if Assigned(MiHilo.FatalException) then
          raise MiHilo.FatalException;
       //si no hay ninguna excepci�n lo iniciamos
       MiHilo.Start;

Compila perfecto pero solo actualiza cuando me muevo con el mouse sobre la barra de herramientas, como en los casos anteriores. O bien cuando muestro el ShowMessage.

Se les ocurre algo mas?

Saludos,

Pancho
C�rdoba
Argentina

2015-08-05 20:55 GMT-03:00 Martin Gomez <mmgomez en gmail.com>:

Show quoted text 17 lines
Con el Sincronize(UpdPeso) tampoco? Eso deber�a aislarte del multithreading interno de LazSerial (si es que tiene) -- ? 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

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150805/20f3c02e/attachment.html>

Reply by email

Maxi
to francisco prieto

que control es?

El 5 de agosto de 2015, 21:28, francisco prieto <fajprieto en gmail.com> escribi�:

Show quoted text 104 lines
Miren hice lo siguiente y aun presenta el mismo error... 1) Agregue un hilo { TMiHilo } TMiHilo = class(TThread) private fStatusText: string; procedure MostrarPeso; protected procedure Execute; override; public constructor Create(CreaSuspendido: boolean); end; 2) En la definicion del formulario coloque esta propiedad como publica public lnPesoTot:real; 3) Agregue los procedimientos de mi hilo { TMiHilo } procedure TMiHilo.MostrarPeso; begin frmPesaje.txtPesoAct.Text:=FloatToStr(frmPesaje.lnPesoTot); frmPesaje.txtPesoAct.Refresh; end; procedure TMiHilo.Execute; var newStatus : string; aaa:string; begin fStatusText := 'Ejecutando...'; while (not Terminated) and (true) do begin sleep(2000); fStatusText := 'Mostrando Peso ...'; Synchronize( @MostrarPeso ); end; end; constructor TMiHilo.Create(CreaSuspendido: boolean); begin FreeOnTerminate := True; inherited Create(CreaSuspendido); end; 4) Agregue una variable en el procedimiento de mi formulario denomidado UpdPeso MiHilo : TMiHilo; para poder hacer referencia a mi hilo. 5) Finalmente agregue el siguiente codigo en el procedimiento UpdPeso //creamos el hilo, pero no lo iniciamos MiHilo := TMiHilo.Create(True); // Con el parametro true no se inicia automaticamente if Assigned(MiHilo.FatalException) then raise MiHilo.FatalException; //si no hay ninguna excepci�n lo iniciamos MiHilo.Start; Compila perfecto pero solo actualiza cuando me muevo con el mouse sobre la barra de herramientas, como en los casos anteriores. O bien cuando muestro el ShowMessage. Se les ocurre algo mas? Saludos, Pancho C�rdoba Argentina 2015-08-05 20:55 GMT-03:00 Martin Gomez <mmgomez en gmail.com>: > Con el Sincronize(UpdPeso) tampoco? Eso deber�a aislarte del > multithreading interno de LazSerial (si es que tiene) > > > -- > ? > 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 > > _______________________________________________ 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.freepascal.org/pipermail/lazarus-es/attachments/20150805/5776af7a/attachment.html>

Reply by email

francisco prieto
to Maxi

Tedit

El mi�, 5 de agosto de 2015 22:59, Maxi <maximiliano.duarte en gmail.com> escribi�:

Show quoted text 124 lines
que control es? El 5 de agosto de 2015, 21:28, francisco prieto <fajprieto en gmail.com> escribi�: > Miren hice lo siguiente y aun presenta el mismo error... > > 1) Agregue un hilo > > { TMiHilo } > > TMiHilo = class(TThread) > private > fStatusText: string; > procedure MostrarPeso; > protected > procedure Execute; override; > public > constructor Create(CreaSuspendido: boolean); > end; > > 2) En la definicion del formulario coloque esta propiedad como publica > > public > lnPesoTot:real; > > 3) Agregue los procedimientos de mi hilo > > { TMiHilo } > procedure TMiHilo.MostrarPeso; > begin > frmPesaje.txtPesoAct.Text:=FloatToStr(frmPesaje.lnPesoTot); > frmPesaje.txtPesoAct.Refresh; > end; > > procedure TMiHilo.Execute; > var > newStatus : string; > aaa:string; > begin > fStatusText := 'Ejecutando...'; > while (not Terminated) and (true) do begin > sleep(2000); > fStatusText := 'Mostrando Peso ...'; > Synchronize( @MostrarPeso ); > end; > end; > > constructor TMiHilo.Create(CreaSuspendido: boolean); > begin > FreeOnTerminate := True; > inherited Create(CreaSuspendido); > end; > > 4) Agregue una variable en el procedimiento de mi formulario denomidado > UpdPeso > > MiHilo : TMiHilo; > > para poder hacer referencia a mi hilo. > > 5) Finalmente agregue el siguiente codigo en el procedimiento UpdPeso > > //creamos el hilo, pero no lo iniciamos > MiHilo := TMiHilo.Create(True); // Con el parametro true no se > inicia automaticamente > if Assigned(MiHilo.FatalException) then > raise MiHilo.FatalException; > //si no hay ninguna excepci�n lo iniciamos > MiHilo.Start; > > Compila perfecto pero solo actualiza cuando me muevo con el mouse sobre > la barra de herramientas, como en los casos anteriores. O bien cuando > muestro el ShowMessage. > > Se les ocurre algo mas? > > Saludos, > > Pancho > C�rdoba > Argentina > > 2015-08-05 20:55 GMT-03:00 Martin Gomez <mmgomez en gmail.com>: > >> Con el Sincronize(UpdPeso) tampoco? Eso deber�a aislarte del >> multithreading interno de LazSerial (si es que tiene) >> >> >> -- >> ? >> 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 >> >> > > _______________________________________________ > 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 _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150806/a1af0a98/attachment-0001.html>

Reply by email

francisco prieto
to francisco prieto

Pero tambi�n. Prob�. Con label en realidad debo mostrar el peso por pantalla, ma�ana intentar� poner todo el poseso dentro del hilo y dispararle desde el onrxdata de lazserial

El mi�, 5 de agosto de 2015 23:13, francisco prieto <fajprieto en gmail.com> escribi�:

Show quoted text 130 lines
Tedit El mi�, 5 de agosto de 2015 22:59, Maxi <maximiliano.duarte en gmail.com> escribi�: > que control es? > > El 5 de agosto de 2015, 21:28, francisco prieto <fajprieto en gmail.com> > escribi�: > >> Miren hice lo siguiente y aun presenta el mismo error... >> >> 1) Agregue un hilo >> >> { TMiHilo } >> >> TMiHilo = class(TThread) >> private >> fStatusText: string; >> procedure MostrarPeso; >> protected >> procedure Execute; override; >> public >> constructor Create(CreaSuspendido: boolean); >> end; >> >> 2) En la definicion del formulario coloque esta propiedad como publica >> >> public >> lnPesoTot:real; >> >> 3) Agregue los procedimientos de mi hilo >> >> { TMiHilo } >> procedure TMiHilo.MostrarPeso; >> begin >> frmPesaje.txtPesoAct.Text:=FloatToStr(frmPesaje.lnPesoTot); >> frmPesaje.txtPesoAct.Refresh; >> end; >> >> procedure TMiHilo.Execute; >> var >> newStatus : string; >> aaa:string; >> begin >> fStatusText := 'Ejecutando...'; >> while (not Terminated) and (true) do begin >> sleep(2000); >> fStatusText := 'Mostrando Peso ...'; >> Synchronize( @MostrarPeso ); >> end; >> end; >> >> constructor TMiHilo.Create(CreaSuspendido: boolean); >> begin >> FreeOnTerminate := True; >> inherited Create(CreaSuspendido); >> end; >> >> 4) Agregue una variable en el procedimiento de mi formulario denomidado >> UpdPeso >> >> MiHilo : TMiHilo; >> >> para poder hacer referencia a mi hilo. >> >> 5) Finalmente agregue el siguiente codigo en el procedimiento UpdPeso >> >> //creamos el hilo, pero no lo iniciamos >> MiHilo := TMiHilo.Create(True); // Con el parametro true no se >> inicia automaticamente >> if Assigned(MiHilo.FatalException) then >> raise MiHilo.FatalException; >> //si no hay ninguna excepci�n lo iniciamos >> MiHilo.Start; >> >> Compila perfecto pero solo actualiza cuando me muevo con el mouse sobre >> la barra de herramientas, como en los casos anteriores. O bien cuando >> muestro el ShowMessage. >> >> Se les ocurre algo mas? >> >> Saludos, >> >> Pancho >> C�rdoba >> Argentina >> >> 2015-08-05 20:55 GMT-03:00 Martin Gomez <mmgomez en gmail.com>: >> >>> Con el Sincronize(UpdPeso) tampoco? Eso deber�a aislarte del >>> multithreading interno de LazSerial (si es que tiene) >>> >>> >>> -- >>> ? >>> 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 >>> >>> >> >> _______________________________________________ >> 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 > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es >

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150806/d5d35eaf/attachment.html>

Reply by email

francisco prieto
to Martin Gomez: Con el Sincronize(UpdPeso) tampoco? Eso deber�a aislarte del multithreading interno de…

Maxi, eso seguramente funciona, pero eso no me sirve porque la cadena que env�a la balanza hay que analizarla, pues no solo trae el peso, trae otros estados que me son de utilidad.

Ademas subi el procedimiento que funciona TfrmCheck.olePuertoRxData(Sender: TObject); y el que no....

y la diferencia entre ambos es justamente esa..., es decir en el caso que funciona, lectura a lectura lo voy tirando en una lista en pantalla y al refresco le da el cuero y eso que mi maquina es un avi�n con acoplado...

en cambio, si analizo la cadena, son tantas las lecturas que entran por olePuertoRxData que no logra refrescar.

En VFP existe algo denominado AutoYield para estos casos que va procesando en la medida que puede cada una de las peticiones y tambi�n existe el DoEvents, aqu� veo que existe algo parecido denominado application.ProcessMessages pero tampoco funciona...

Lo que creo que solucionar�a el problema es...

recibir la data de olePuertoRxData en un hilo por separado cada vez... procesar el hilo
y cada proceso que actualice la pantalla...

Eso es lo que voy a intentar el dia de hoy...

Los mantengo al tanto, pues esto se esta transformando en un error muy interesante de estudiar.

Saludos,

Pancho
C�rdoba
Argentina

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

Show quoted text 415 lines
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

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150806/c6aff2fc/attachment-0001.html>

Reply by email

francisco prieto
to francisco prieto

Creo que estoy mas cerca, aunque ahora da otro error...

Les cuento los cambios que hice...

1) Agregue la propiedad publica lcLectura a la clase TMiHilo

    TMiHilo = class(TThread)
    private
      fStatusText: string;
      procedure MostrarPeso;
    protected
      procedure Execute; override;
    public
      lcLectura:string;
      constructor Create(CreaSuspendido: boolean);
    end;

2) Modifique el contenido de UpdPeso, ahora solo crea el hilo y le pasa la lectura recibida de la balanza... esa que como les comente en la otra pantalla la muestro en una lista.

procedure TfrmPesaje.UpdPeso(cLectura:String);
var
  MiHilo : TMiHilo;
begin
     //creamos el hilo, pero no lo iniciamos
     MiHilo := TMiHilo.Create(True); // Con el parametro true no se inicia
automaticamente
     if Assigned(MiHilo.FatalException) then
        raise MiHilo.FatalException;
     //si no hay ninguna excepci�n lo iniciamos
     MiHilo.lcLectura:=cLectura;
     MiHilo.Start;
end;

3) Modifique el contenido de MostrarPeso en MiHilo, para que contenga todo el analisis de la trama y lo muestre por pantalla.

procedure TMiHilo.MostrarPeso;
var
  lcTramas:TStringList;
  lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer;
  lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales:string;
  lnPesoTara,lnPesoTot:real;
  lnPesoComa:integer;
begin
  lcEstadoA:='';
  lcEstadoB:='';
  lcEstadoC:='';
  lcPeso:='';
  lcTara:='';
  lcTramas:= TStringList.Create;
  Split('|', lcLectura, 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);
       frmPesaje.txtPesoAct.Text:=FloatToStr(lnPesoTot);
       frmPesaje.txtPesoAct.Refresh;
   end;
end;

Todo eso compila fantastico pero al ejecutar da el siguiente error:

Thread creation error: Espacio de almacenamiento insuficiente para procesar este comando

constructor TMiHilo.Create(CreaSuspendido: boolean);
begin
  FreeOnTerminate := True;
  inherited Create(CreaSuspendido); <== aca da el error
end;

Espero sus comentario, y de paso invenstigo.

Saludos,

Pancho
C�rdoba
Argentina

El 6 de agosto de 2015, 8:02, francisco prieto <fajprieto en gmail.com> escribi�:

Show quoted text 459 lines
Maxi, eso seguramente funciona, pero eso no me sirve porque la cadena que env�a la balanza hay que analizarla, pues no solo trae el peso, trae otros estados que me son de utilidad. Ademas subi el procedimiento que funciona TfrmCheck.olePuertoRxData(Sender: TObject); y el que no.... y la diferencia entre ambos es justamente esa..., es decir en el caso que funciona, lectura a lectura lo voy tirando en una lista en pantalla y al refresco le da el cuero y eso que mi maquina es un avi�n con acoplado... en cambio, si analizo la cadena, son tantas las lecturas que entran por olePuertoRxData que no logra refrescar. En VFP existe algo denominado AutoYield para estos casos que va procesando en la medida que puede cada una de las peticiones y tambi�n existe el DoEvents, aqu� veo que existe algo parecido denominado application.ProcessMessages pero tampoco funciona... Lo que creo que solucionar�a el problema es... recibir la data de olePuertoRxData en un hilo por separado cada vez... procesar el hilo y cada proceso que actualice la pantalla... Eso es lo que voy a intentar el dia de hoy... Los mantengo al tanto, pues esto se esta transformando en un error muy interesante de estudiar. Saludos, Pancho C�rdoba Argentina 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 > >

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150806/2f5af107/attachment-0001.html>

Reply by email

Maxi
to Martin Gomez: Con el Sincronize(UpdPeso) tampoco? Eso deber�a aislarte del multithreading interno de…

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�:

Show quoted text 415 lines
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.freepascal.org/pipermail/lazarus-es/attachments/20150806/4b15b935/attachment-0001.html>

Reply by email

Maxi
to francisco prieto: Creo que estoy mas cerca, aunque ahora da otro error... Les cuento los cambios que hice...

Como te dije en principio, es un tema de tiempos.
Para eso existe el handshak cuando el receptor no est� disponible avisa para que no mande mas datos. Pero en estos bichos generalmente tira datos sin esperar acuse.
Para eso deberias descartar cualquier paquete hasta que no hayas procesado todo. Podes hacer flush mientras procesas.
No le encuentro en las funciones como ignorar sin cerrar el puerto

El 6 de agosto de 2015, 9:54, francisco prieto <fajprieto en gmail.com> escribi�:

Show quoted text 584 lines
Creo que estoy mas cerca, aunque ahora da otro error... Les cuento los cambios que hice... 1) Agregue la propiedad publica lcLectura a la clase TMiHilo TMiHilo = class(TThread) private fStatusText: string; procedure MostrarPeso; protected procedure Execute; override; public lcLectura:string; constructor Create(CreaSuspendido: boolean); end; 2) Modifique el contenido de UpdPeso, ahora solo crea el hilo y le pasa la lectura recibida de la balanza... esa que como les comente en la otra pantalla la muestro en una lista. procedure TfrmPesaje.UpdPeso(cLectura:String); var MiHilo : TMiHilo; begin //creamos el hilo, pero no lo iniciamos MiHilo := TMiHilo.Create(True); // Con el parametro true no se inicia automaticamente if Assigned(MiHilo.FatalException) then raise MiHilo.FatalException; //si no hay ninguna excepci�n lo iniciamos MiHilo.lcLectura:=cLectura; MiHilo.Start; end; 3) Modifique el contenido de MostrarPeso en MiHilo, para que contenga todo el analisis de la trama y lo muestre por pantalla. procedure TMiHilo.MostrarPeso; var lcTramas:TStringList; lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer; lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales:string; lnPesoTara,lnPesoTot:real; lnPesoComa:integer; begin lcEstadoA:=''; lcEstadoB:=''; lcEstadoC:=''; lcPeso:=''; lcTara:=''; lcTramas:= TStringList.Create; Split('|', lcLectura, 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); frmPesaje.txtPesoAct.Text:=FloatToStr(lnPesoTot); frmPesaje.txtPesoAct.Refresh; end; end; Todo eso compila fantastico pero al ejecutar da el siguiente error: Thread creation error: Espacio de almacenamiento insuficiente para procesar este comando constructor TMiHilo.Create(CreaSuspendido: boolean); begin FreeOnTerminate := True; inherited Create(CreaSuspendido); <== aca da el error end; Espero sus comentario, y de paso invenstigo. Saludos, Pancho C�rdoba Argentina El 6 de agosto de 2015, 8:02, francisco prieto <fajprieto en gmail.com> escribi�: > Maxi, eso seguramente funciona, pero eso no me sirve porque la cadena que > env�a la balanza hay que analizarla, pues no solo trae el peso, trae otros > estados que me son de utilidad. > > Ademas subi el procedimiento que funciona > TfrmCheck.olePuertoRxData(Sender: TObject); y el que no.... > > y la diferencia entre ambos es justamente esa..., es decir en el caso que > funciona, lectura a lectura lo voy tirando en una lista en pantalla y al > refresco le da el cuero y eso que mi maquina es un avi�n con acoplado... > > en cambio, si analizo la cadena, son tantas las lecturas que entran por > olePuertoRxData que no logra refrescar. > > En VFP existe algo denominado AutoYield para estos casos que va > procesando en la medida que puede cada una de las peticiones y tambi�n > existe el DoEvents, aqu� veo que existe algo parecido denominado > application.ProcessMessages pero tampoco funciona... > > Lo que creo que solucionar�a el problema es... > > recibir la data de olePuertoRxData en un hilo por separado cada vez... > procesar el hilo > y cada proceso que actualice la pantalla... > > Eso es lo que voy a intentar el dia de hoy... > > Los mantengo al tanto, pues esto se esta transformando en un error muy > interesante de estudiar. > > Saludos, > > Pancho > C�rdoba > Argentina > > > > 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 >> >> > _______________________________________________ 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.freepascal.org/pipermail/lazarus-es/attachments/20150806/e98645f6/attachment-0001.html>

Reply by email

Maxi

Como te dije en principio, es un tema de tiempos.
Para eso existe el handshak cuando el receptor no est� disponible avisa para que no mande mas datos. Pero en estos bichos generalmente tira datos sin esperar acuse.
Para eso deberias descartar cualquier paquete hasta que no hayas procesado todo. Podes hacer flush mientras procesas. No le encuentro en las funciones como ignorar sin cerrar el puerto

El 6 de agosto de 2015, 9:54, francisco prieto <fajprieto en gmail.com> escribi�:

Show quoted text 519 lines
Creo que estoy mas cerca, aunque ahora da otro error... Les cuento los cambios que hice... 1) Agregue la propiedad publica lcLectura a la clase TMiHilo TMiHilo = class(TThread) private fStatusText: string; procedure MostrarPeso; protected procedure Execute; override; public lcLectura:string; constructor Create(CreaSuspendido: boolean); end; 2) Modifique el contenido de UpdPeso, ahora solo crea el hilo y le pasa la lectura recibida de la balanza... esa que como les comente en la otra pantalla la muestro en una lista. procedure TfrmPesaje.UpdPeso(cLectura:String); var MiHilo : TMiHilo; begin //creamos el hilo, pero no lo iniciamos MiHilo := TMiHilo.Create(True); // Con el parametro true no se inicia automaticamente if Assigned(MiHilo.FatalException) then raise MiHilo.FatalException; //si no hay ninguna excepci�n lo iniciamos MiHilo.lcLectura:=cLectura; MiHilo.Start; end; 3) Modifique el contenido de MostrarPeso en MiHilo, para que contenga todo el analisis de la trama y lo muestre por pantalla. procedure TMiHilo.MostrarPeso; var lcTramas:TStringList; lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer; lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales:string; lnPesoTara,lnPesoTot:real; lnPesoComa:integer; begin lcEstadoA:=''; lcEstadoB:=''; lcEstadoC:=''; lcPeso:=''; lcTara:=''; lcTramas:= TStringList.Create; Split('|', lcLectura, 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); frmPesaje.txtPesoAct.Text:=FloatToStr(lnPesoTot); frmPesaje.txtPesoAct.Refresh; end; end; Todo eso compila fantastico pero al ejecutar da el siguiente error: Thread creation error: Espacio de almacenamiento insuficiente para procesar este comando constructor TMiHilo.Create(CreaSuspendido: boolean); begin FreeOnTerminate := True; inherited Create(CreaSuspendido); <== aca da el error end; Espero sus comentario, y de paso invenstigo. Saludos, Pancho C�rdoba Argentina El 6 de agosto de 2015, 8:02, francisco prieto <fajprieto en gmail.com> escribi�: > > Maxi, eso seguramente funciona, pero eso no me sirve porque la cadena que env�a la balanza hay que analizarla, pues no solo trae el peso, trae otros estados que me son de utilidad. > > Ademas subi el procedimiento que funciona TfrmCheck.olePuertoRxData(Sender: TObject); y el que no.... > > y la diferencia entre ambos es justamente esa..., es decir en el caso que funciona, lectura a lectura lo voy tirando en una lista en pantalla y al refresco le da el cuero y eso que mi maquina es un avi�n con acoplado... > > en cambio, si analizo la cadena, son tantas las lecturas que entran por olePuertoRxData que no logra refrescar. > > En VFP existe algo denominado AutoYield para estos casos que va procesando en la medida que puede cada una de las peticiones y tambi�n existe el DoEvents, aqu� veo que existe algo parecido denominado application.ProcessMessages pero tampoco funciona... > > Lo que creo que solucionar�a el problema es... > > recibir la data de olePuertoRxData en un hilo por separado cada vez... > procesar el hilo > y cada proceso que actualice la pantalla... > > Eso es lo que voy a intentar el dia de hoy... > > Los mantengo al tanto, pues esto se esta transformando en un error muy interesante de estudiar. > > Saludos, > > Pancho > C�rdoba > Argentina > > > > 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. >>>>> 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. >>>> >>>> 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 >> > _______________________________________________ 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 -- 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

Reply by email

francisco prieto
to Maxi: hice una prueba Programe un arduino que lea un canal analogico cada 10ms y lo transmite a…

Si, pero te repito Maxi

El proceso que anda bien tira la info a una lista sin inconvenientes y lo unico que le agregue es un proceso que analiza la trama y justamente por ese calculo no se me refresca el edit.

Se me ocurrio tambien poner esa lista en pantalla en forma invisible e ir leyendo como si fuera una cola pero me parece muy desprolijo.

Saludos y gracias por la onda.

Pancho
C�rdoba
Argentina

El 6 de agosto de 2015, 12:34, Maxi <maximiliano.duarte en gmail.com> escribi�:

Show quoted text 499 lines
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 _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150806/dfe48988/attachment-0001.html>

Reply by email

francisco prieto
to Maxi: Como te dije en principio, es un tema de tiempos. Para eso existe el handshak cuando el…

ok, esa es otra solucion valida entonces.

recibo el paquete.
cierro el puerto.
analizo el paquete.
actualizo la pantalla
abro el puerto.

Me gusta, gracias.

Pruebo y te cuento.

Pancho
C�rdoba
Argentina

El 6 de agosto de 2015, 14:02, Maxi <maximiliano.duarte en gmail.com> escribi�:

Show quoted text 623 lines
Como te dije en principio, es un tema de tiempos. Para eso existe el handshak cuando el receptor no est� disponible avisa para que no mande mas datos. Pero en estos bichos generalmente tira datos sin esperar acuse. Para eso deberias descartar cualquier paquete hasta que no hayas procesado todo. Podes hacer flush mientras procesas. No le encuentro en las funciones como ignorar sin cerrar el puerto El 6 de agosto de 2015, 9:54, francisco prieto <fajprieto en gmail.com> escribi�: > > Creo que estoy mas cerca, aunque ahora da otro error... > > Les cuento los cambios que hice... > > 1) Agregue la propiedad publica lcLectura a la clase TMiHilo > > TMiHilo = class(TThread) > private > fStatusText: string; > procedure MostrarPeso; > protected > procedure Execute; override; > public > lcLectura:string; > constructor Create(CreaSuspendido: boolean); > end; > > 2) Modifique el contenido de UpdPeso, ahora solo crea el hilo y le pasa la lectura recibida de la balanza... esa que como les comente en la otra pantalla la muestro en una lista. > > procedure TfrmPesaje.UpdPeso(cLectura:String); > var > MiHilo : TMiHilo; > begin > //creamos el hilo, pero no lo iniciamos > MiHilo := TMiHilo.Create(True); // Con el parametro true no se inicia automaticamente > if Assigned(MiHilo.FatalException) then > raise MiHilo.FatalException; > //si no hay ninguna excepci�n lo iniciamos > MiHilo.lcLectura:=cLectura; > MiHilo.Start; > end; > > 3) Modifique el contenido de MostrarPeso en MiHilo, para que contenga todo el analisis de la trama y lo muestre por pantalla. > > procedure TMiHilo.MostrarPeso; > var > lcTramas:TStringList; > lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer; > lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales:string; > lnPesoTara,lnPesoTot:real; > lnPesoComa:integer; > begin > lcEstadoA:=''; > lcEstadoB:=''; > lcEstadoC:=''; > lcPeso:=''; > lcTara:=''; > lcTramas:= TStringList.Create; > Split('|', lcLectura, 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); > frmPesaje.txtPesoAct.Text:=FloatToStr(lnPesoTot); > frmPesaje.txtPesoAct.Refresh; > end; > end; > > Todo eso compila fantastico pero al ejecutar da el siguiente error: > > Thread creation error: Espacio de almacenamiento insuficiente para procesar este comando > > constructor TMiHilo.Create(CreaSuspendido: boolean); > begin > FreeOnTerminate := True; > inherited Create(CreaSuspendido); <== aca da el error > end; > > Espero sus comentario, y de paso invenstigo. > > Saludos, > > Pancho > C�rdoba > Argentina > > El 6 de agosto de 2015, 8:02, francisco prieto <fajprieto en gmail.com> escribi�: >> >> Maxi, eso seguramente funciona, pero eso no me sirve porque la cadena que env�a la balanza hay que analizarla, pues no solo trae el peso, trae otros estados que me son de utilidad. >> >> Ademas subi el procedimiento que funciona TfrmCheck.olePuertoRxData(Sender: TObject); y el que no.... >> >> y la diferencia entre ambos es justamente esa..., es decir en el caso que funciona, lectura a lectura lo voy tirando en una lista en pantalla y al refresco le da el cuero y eso que mi maquina es un avi�n con acoplado... >> >> en cambio, si analizo la cadena, son tantas las lecturas que entran por olePuertoRxData que no logra refrescar. >> >> En VFP existe algo denominado AutoYield para estos casos que va procesando en la medida que puede cada una de las peticiones y tambi�n existe el DoEvents, aqu� veo que existe algo parecido denominado application.ProcessMessages pero tampoco funciona... >> >> Lo que creo que solucionar�a el problema es... >> >> recibir la data de olePuertoRxData en un hilo por separado cada vez... >> procesar el hilo >> y cada proceso que actualice la pantalla... >> >> Eso es lo que voy a intentar el dia de hoy... >> >> Los mantengo al tanto, pues esto se esta transformando en un error muy interesante de estudiar. >> >> Saludos, >> >> Pancho >> C�rdoba >> Argentina >> >> >> >> 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 . >>>>>> 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 . >>>>> >>>>> 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 >>> >> > > > _______________________________________________ > 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 -- 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 _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150806/7b2684e6/attachment-0001.html>

Reply by email

Jesus Reyes
to francisco prieto: Si, pero te repito Maxi El proceso que anda bien tira la info a una lista sin…

Antes de comentar sobre el tema de los mensajes anteriores quiero hacer notar algo. No solo para los que han estado aportando sus comentarios sino para todos los suscriptores.

Los �ltimos mensajes han sido enviados a moderaci�n por que exceden los l�mites permitidos impuestos por el administrador del servidor de correo.

Me parece que hay 2 razones para ello.

1. Aparentemente. El mensaje inicial fue enviado en dos/varios formatos. En realidad necesito analizar por que el mensaje fue tan grande (en bytes), a�n no lo hago pero esa fue mi primera impresi�n. Normalmente esto sucede cuando se incluyen im�genes o archivos adjuntos muy grandes, pero �sorpresa!, en estos mensajes no hay. Hay que analizarlo.

2. Las contestaciones a los mensajes incluyen *innecesariamente* todo el texto del mensaje anterior, lo que hace que el tama�o del mensaje se incremente, lo cual incremente la posibilidad de que el mensaje entre a moderaci�n.

�Porque afecta esto?, bueno como he mencionado, los mensajes se van directamente a moderaci�n y hasta que tengo tiempo de revisar los pendientes es que me doy cuenta y es cuando los pongo en circulaci�n, para mi no es mucho trabajo pero el verdadero problema es que la comunicaci�n deja de ser fluida para todos.

As� que con el fin de lograr una comunicaci�n m�s fluida sugiero que borren todo el contenido del mensaje anterior menos las partes que consideren *realmente* relevantes para su contestaci�n.

Gracias.

Saludos.

Jesus Reyes A.

--------------------------------------------
El jue 6-ago-15, francisco prieto <fajprieto en gmail.com> escribi�:

Asunto: Re: [Lazarus-es] [Fpc] Refresh no funciona A: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Fecha: jueves, 6 de agosto de 2015, 12:03

Si, pero te repito
Maxi

El proceso que anda bien tira la info a una lista sin inconvenientes y lo unico que le agregue es un proceso que analiza la trama y justamente por ese calculo no se me refresca el edit.

Se me ocurrio tambien poner esa lista en pantalla en forma invisible e ir leyendo como si fuera una cola pero me parece muy desprolijo.

Saludos y gracias por la onda.

Pancho
C�rdoba
Argentina

Reply by email

Maxi
to francisco prieto: ok, esa es otra solucion valida entonces. recibo el paquete. cierro el puerto. analizo el…

Lo de la cola no es desprolijo, yo lo hice hace tiempo, un lista FIFO, acotada a cierto numero de entradas. Lo desprolijo es que no tiene sentido procesar algo que ya no sirve.
Antes de poner a cerrar el puerto usa un flag que te indique si ya esta listo para el nuevo dato, mientras tanto haces flush.

procedure TForm1.LazSerial1RxData(Sender: TObject);
begin
  if yaMostre then
  Begin
     yaMostre:=False;
     Edit1.Text:= trim(LazSerial1.ReadData);
     MostrarDatos;
     Application.ProcessMessages;
     yaMostre:=True;
  end
  else
     LazSerial1.SynSer.Flush;
end;

El d�a 6 de agosto de 2015, 14:06, francisco prieto <fajprieto en gmail.com> escribi�:

Show quoted text 646 lines
ok, esa es otra solucion valida entonces. recibo el paquete. cierro el puerto. analizo el paquete. actualizo la pantalla abro el puerto. Me gusta, gracias. Pruebo y te cuento. Pancho C�rdoba Argentina El 6 de agosto de 2015, 14:02, Maxi <maximiliano.duarte en gmail.com> escribi�: > > Como te dije en principio, es un tema de tiempos. > Para eso existe el handshak cuando el receptor no est� disponible > avisa para que no mande mas datos. Pero en estos bichos generalmente > tira datos sin esperar acuse. > Para eso deberias descartar cualquier paquete hasta que no hayas > procesado todo. Podes hacer flush mientras procesas. > No le encuentro en las funciones como ignorar sin cerrar el puerto > > El 6 de agosto de 2015, 9:54, francisco prieto <fajprieto en gmail.com> > escribi�: > > > > Creo que estoy mas cerca, aunque ahora da otro error... > > > > Les cuento los cambios que hice... > > > > 1) Agregue la propiedad publica lcLectura a la clase TMiHilo > > > > TMiHilo = class(TThread) > > private > > fStatusText: string; > > procedure MostrarPeso; > > protected > > procedure Execute; override; > > public > > lcLectura:string; > > constructor Create(CreaSuspendido: boolean); > > end; > > > > 2) Modifique el contenido de UpdPeso, ahora solo crea el hilo y le pasa > > la lectura recibida de la balanza... esa que como les comente en la otra > > pantalla la muestro en una lista. > > > > procedure TfrmPesaje.UpdPeso(cLectura:String); > > var > > MiHilo : TMiHilo; > > begin > > //creamos el hilo, pero no lo iniciamos > > MiHilo := TMiHilo.Create(True); // Con el parametro true no se > > inicia automaticamente > > if Assigned(MiHilo.FatalException) then > > raise MiHilo.FatalException; > > //si no hay ninguna excepci�n lo iniciamos > > MiHilo.lcLectura:=cLectura; > > MiHilo.Start; > > end; > > > > 3) Modifique el contenido de MostrarPeso en MiHilo, para que contenga > > todo el analisis de la trama y lo muestre por pantalla. > > > > procedure TMiHilo.MostrarPeso; > > var > > lcTramas:TStringList; > > > > lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer; > > lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales:string; > > lnPesoTara,lnPesoTot:real; > > lnPesoComa:integer; > > begin > > lcEstadoA:=''; > > lcEstadoB:=''; > > lcEstadoC:=''; > > lcPeso:=''; > > lcTara:=''; > > lcTramas:= TStringList.Create; > > Split('|', lcLectura, 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); > > frmPesaje.txtPesoAct.Text:=FloatToStr(lnPesoTot); > > frmPesaje.txtPesoAct.Refresh; > > end; > > end; > > > > Todo eso compila fantastico pero al ejecutar da el siguiente error: > > > > Thread creation error: Espacio de almacenamiento insuficiente para > > procesar este comando > > > > constructor TMiHilo.Create(CreaSuspendido: boolean); > > begin > > FreeOnTerminate := True; > > inherited Create(CreaSuspendido); <== aca da el error > > end; > > > > Espero sus comentario, y de paso invenstigo. > > > > Saludos, > > > > Pancho > > C�rdoba > > Argentina > > > > El 6 de agosto de 2015, 8:02, francisco prieto <fajprieto en gmail.com> > > escribi�: > >> > >> Maxi, eso seguramente funciona, pero eso no me sirve porque la cadena > >> que env�a la balanza hay que analizarla, pues no solo trae el peso, trae > >> otros estados que me son de utilidad. > >> > >> Ademas subi el procedimiento que funciona > >> TfrmCheck.olePuertoRxData(Sender: TObject); y el que no.... > >> > >> y la diferencia entre ambos es justamente esa..., es decir en el caso > >> que funciona, lectura a lectura lo voy tirando en una lista en pantalla y al > >> refresco le da el cuero y eso que mi maquina es un avi�n con acoplado... > >> > >> en cambio, si analizo la cadena, son tantas las lecturas que entran por > >> olePuertoRxData que no logra refrescar. > >> > >> En VFP existe algo denominado AutoYield para estos casos que va > >> procesando en la medida que puede cada una de las peticiones y tambi�n > >> existe el DoEvents, aqu� veo que existe algo parecido denominado > >> application.ProcessMessages pero tampoco funciona... > >> > >> Lo que creo que solucionar�a el problema es... > >> > >> recibir la data de olePuertoRxData en un hilo por separado cada vez... > >> procesar el hilo > >> y cada proceso que actualice la pantalla... > >> > >> Eso es lo que voy a intentar el dia de hoy... > >> > >> Los mantengo al tanto, pues esto se esta transformando en un error muy > >> interesante de estudiar. > >> > >> Saludos, > >> > >> Pancho > >> C�rdoba > >> Argentina > >> > >> > >> > >> 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. > >>>>>> 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. > >>>>> > >>>>> 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 > >>> > >> > > > > > > _______________________________________________ > > 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 > > > > -- > 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 > > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es _______________________________________________ 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

Reply by email

Maxi
to Maxi

ya te lo resolvi con banderas y un timer le puse cada 100ms y refresca decentemente. Probalo

procedure TForm1.LazSerial1RxData(Sender: TObject);
begin
  if fmostre then
  Begin
       fmostre:=false;
       fdato:= LazSerial1.ReadData;
  end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Edit1.Text:=fdato;
  Application.ProcessMessages;
  fmostre:=true;
end;

El d�a 6 de agosto de 2015, 15:18, Maxi <maximiliano.duarte en gmail.com> escribi�:

Show quoted text 679 lines
Lo de la cola no es desprolijo, yo lo hice hace tiempo, un lista FIFO, acotada a cierto numero de entradas. Lo desprolijo es que no tiene sentido procesar algo que ya no sirve. Antes de poner a cerrar el puerto usa un flag que te indique si ya esta listo para el nuevo dato, mientras tanto haces flush. procedure TForm1.LazSerial1RxData(Sender: TObject); begin if yaMostre then Begin yaMostre:=False; Edit1.Text:= trim(LazSerial1.ReadData); MostrarDatos; Application.ProcessMessages; yaMostre:=True; end else LazSerial1.SynSer.Flush; end; El d�a 6 de agosto de 2015, 14:06, francisco prieto <fajprieto en gmail.com> escribi�: > ok, esa es otra solucion valida entonces. > > recibo el paquete. > cierro el puerto. > analizo el paquete. > actualizo la pantalla > abro el puerto. > > Me gusta, gracias. > > Pruebo y te cuento. > > Pancho > C�rdoba > Argentina > > El 6 de agosto de 2015, 14:02, Maxi <maximiliano.duarte en gmail.com> escribi�: >> >> Como te dije en principio, es un tema de tiempos. >> Para eso existe el handshak cuando el receptor no est� disponible >> avisa para que no mande mas datos. Pero en estos bichos generalmente >> tira datos sin esperar acuse. >> Para eso deberias descartar cualquier paquete hasta que no hayas >> procesado todo. Podes hacer flush mientras procesas. >> No le encuentro en las funciones como ignorar sin cerrar el puerto >> >> El 6 de agosto de 2015, 9:54, francisco prieto <fajprieto en gmail.com> >> escribi�: >> > >> > Creo que estoy mas cerca, aunque ahora da otro error... >> > >> > Les cuento los cambios que hice... >> > >> > 1) Agregue la propiedad publica lcLectura a la clase TMiHilo >> > >> > TMiHilo = class(TThread) >> > private >> > fStatusText: string; >> > procedure MostrarPeso; >> > protected >> > procedure Execute; override; >> > public >> > lcLectura:string; >> > constructor Create(CreaSuspendido: boolean); >> > end; >> > >> > 2) Modifique el contenido de UpdPeso, ahora solo crea el hilo y le pasa >> > la lectura recibida de la balanza... esa que como les comente en la otra >> > pantalla la muestro en una lista. >> > >> > procedure TfrmPesaje.UpdPeso(cLectura:String); >> > var >> > MiHilo : TMiHilo; >> > begin >> > //creamos el hilo, pero no lo iniciamos >> > MiHilo := TMiHilo.Create(True); // Con el parametro true no se >> > inicia automaticamente >> > if Assigned(MiHilo.FatalException) then >> > raise MiHilo.FatalException; >> > //si no hay ninguna excepci�n lo iniciamos >> > MiHilo.lcLectura:=cLectura; >> > MiHilo.Start; >> > end; >> > >> > 3) Modifique el contenido de MostrarPeso en MiHilo, para que contenga >> > todo el analisis de la trama y lo muestre por pantalla. >> > >> > procedure TMiHilo.MostrarPeso; >> > var >> > lcTramas:TStringList; >> > >> > lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer; >> > lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales:string; >> > lnPesoTara,lnPesoTot:real; >> > lnPesoComa:integer; >> > begin >> > lcEstadoA:=''; >> > lcEstadoB:=''; >> > lcEstadoC:=''; >> > lcPeso:=''; >> > lcTara:=''; >> > lcTramas:= TStringList.Create; >> > Split('|', lcLectura, 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); >> > frmPesaje.txtPesoAct.Text:=FloatToStr(lnPesoTot); >> > frmPesaje.txtPesoAct.Refresh; >> > end; >> > end; >> > >> > Todo eso compila fantastico pero al ejecutar da el siguiente error: >> > >> > Thread creation error: Espacio de almacenamiento insuficiente para >> > procesar este comando >> > >> > constructor TMiHilo.Create(CreaSuspendido: boolean); >> > begin >> > FreeOnTerminate := True; >> > inherited Create(CreaSuspendido); <== aca da el error >> > end; >> > >> > Espero sus comentario, y de paso invenstigo. >> > >> > Saludos, >> > >> > Pancho >> > C�rdoba >> > Argentina >> > >> > El 6 de agosto de 2015, 8:02, francisco prieto <fajprieto en gmail.com> >> > escribi�: >> >> >> >> Maxi, eso seguramente funciona, pero eso no me sirve porque la cadena >> >> que env�a la balanza hay que analizarla, pues no solo trae el peso, trae >> >> otros estados que me son de utilidad. >> >> >> >> Ademas subi el procedimiento que funciona >> >> TfrmCheck.olePuertoRxData(Sender: TObject); y el que no.... >> >> >> >> y la diferencia entre ambos es justamente esa..., es decir en el caso >> >> que funciona, lectura a lectura lo voy tirando en una lista en pantalla y al >> >> refresco le da el cuero y eso que mi maquina es un avi�n con acoplado... >> >> >> >> en cambio, si analizo la cadena, son tantas las lecturas que entran por >> >> olePuertoRxData que no logra refrescar. >> >> >> >> En VFP existe algo denominado AutoYield para estos casos que va >> >> procesando en la medida que puede cada una de las peticiones y tambi�n >> >> existe el DoEvents, aqu� veo que existe algo parecido denominado >> >> application.ProcessMessages pero tampoco funciona... >> >> >> >> Lo que creo que solucionar�a el problema es... >> >> >> >> recibir la data de olePuertoRxData en un hilo por separado cada vez... >> >> procesar el hilo >> >> y cada proceso que actualice la pantalla... >> >> >> >> Eso es lo que voy a intentar el dia de hoy... >> >> >> >> Los mantengo al tanto, pues esto se esta transformando en un error muy >> >> interesante de estudiar. >> >> >> >> Saludos, >> >> >> >> Pancho >> >> C�rdoba >> >> Argentina >> >> >> >> >> >> >> >> 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. >> >>>>>> 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. >> >>>>> >> >>>>> 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 >> >>> >> >> >> > >> > >> > _______________________________________________ >> > 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 >> >> >> >> -- >> 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 >> >> _______________________________________________ >> Lazarus-es mailing list >> Lazarus-es en lists.lazarus.freepascal.org >> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es > > > > _______________________________________________ > 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
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

Reply by email

Jerónimo Sánchez
to francisco prieto: Tengo el siguiente c�digo procedure TfrmPesaje.UpdPeso(cLectura:String); var…

Muchas gracias, Pancho.

Te he estado siguiendo en la lisa de lazarus.es y veo que pudistes salir muy bien de todos los consejos.

Bonito por tu parte. Un abrazo y todo un detalle por este aporte

El martes, 4 de agosto de 2015, 19:30:50 (UTC+3), Pancho escribi�:

Show quoted text 75 lines
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

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150809/ee7d2bd6/attachment.html>

Reply by email

Maxi
to Jerónimo Sánchez

Funciona?

El d�a 9 de agosto de 2015, 6:33, Jer�nimo S�nchez <socger en gmail.com> escribi�:

Show quoted text 91 lines
Muchas gracias, Pancho. Te he estado siguiendo en la lisa de lazarus.es y veo que pudistes salir muy bien de todos los consejos. Bonito por tu parte. Un abrazo y todo un detalle por este aporte El martes, 4 de agosto de 2015, 19:30:50 (UTC+3), Pancho 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 _______________________________________________ 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

Reply by email

francisco prieto
to Maxi

Si, Maxi

Respondi antes pero me llego un mesaje que elmoderador elimino el mensaje.

Puedo reenviar mi respuesta.

Saludos,

Pancho
Cordoba
Argentina

El 14 de agosto de 2015, 10:47, Maxi <maximiliano.duarte en gmail.com> escribi�:

Show quoted text 118 lines
Funciona? El d�a 9 de agosto de 2015, 6:33, Jer�nimo S�nchez <socger en gmail.com> escribi�: > Muchas gracias, Pancho. > > Te he estado siguiendo en la lisa de lazarus.es y veo que pudistes salir muy > bien de todos los consejos. > > Bonito por tu parte. Un abrazo y todo un detalle por este aporte > > > El martes, 4 de agosto de 2015, 19:30:50 (UTC+3), Pancho 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 > > > _______________________________________________ > 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 _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150814/06358c66/attachment.html>

Reply by email

Maxi
to francisco prieto

Me qued� la pica como qued� el asusnto. Hice hace tiempo un sistema de despacho de hormigon en delphi y lo haciamos por timer cada 100ms leeyendo eun registro que venia de la consola.

El d�a 14 de agosto de 2015, 15:03, francisco prieto <fajprieto en gmail.com> escribi�:

Show quoted text 141 lines
Si, Maxi Respondi antes pero me llego un mesaje que elmoderador elimino el mensaje. Puedo reenviar mi respuesta. Saludos, Pancho Cordoba Argentina El 14 de agosto de 2015, 10:47, Maxi <maximiliano.duarte en gmail.com> escribi�: > > Funciona? > > El d�a 9 de agosto de 2015, 6:33, Jer�nimo S�nchez <socger en gmail.com> > escribi�: > > Muchas gracias, Pancho. > > > > Te he estado siguiendo en la lisa de lazarus.es y veo que pudistes salir > > muy > > bien de todos los consejos. > > > > Bonito por tu parte. Un abrazo y todo un detalle por este aporte > > > > > > El martes, 4 de agosto de 2015, 19:30:50 (UTC+3), Pancho 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 > > > > > > _______________________________________________ > > 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 > > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es _______________________________________________ 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

Reply by email