Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problemas para acceder a componenente de un Form desde un Hilo (https://www.clubdelphi.com/foros/showthread.php?t=87648)

NEG1414 05-02-2015 09:52:59

Problemas para acceder a componenente de un Form desde un Hilo
 
Buenas..

Llevo dandole vueltas a este problema y estoy desesperado..

Pretendo Modificar un componente que esta en un Form desde un Hilo ejecutado desde el propio form...

El caso es que si el Form no es Modal (hijo) funciona perfectamente....

https://app.box.com/s/hdydb399hsikzauxszhpsiwyv2j6wxvk

Por el contario si el Form es Modal.. el Hilo no hace nada (tampoco da error)

https://app.box.com/s/3nq24hh5dgrl4dk37dx1473aei7n38zr

Necesito que sea modal.

En fin... Debo resignarme, olvidarme por que no es posible hacerlo desde un form Modal..:( o por el contrario me dais una alegria y puedo seguir "mi camino":)..

Gracias

Neftali [Germán.Estévez] 05-02-2015 10:14:33

No domino C++, pero si es similar a lo que se hace en Delphi, deberías modificar los componentes visuales desde dentro del hilo utilizando sincronización de forma obligatoria (revisa la ayuda sobre el método Synchronize y sus ejemplos).

escafandra 05-02-2015 11:08:48

Como te indica Neftali, es posible pero siempre que vayas a trabajar con un elemento de la VCL desde un hilo, sebes usar si o si, Synchronize.

Te pongo un ejemplo simple de un hilo que modifica un Label en un Form modal:

Código:

#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include "Unit3.h"
//---------------------------------------------------------------------------
class ThPrueba : public TThread
{
private:
  TForm3 *Form;
  String LS;
protected:
        void __fastcall Execute();
public:
        __fastcall ThPrueba(TForm3 *form, bool CreateSuspended);
        void __fastcall ActualizaLabel();
};
//---------------------------------------------------------------------------
#endif

Código:

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"

#pragma package(smart_init)

__fastcall ThPrueba::ThPrueba(TForm3 *form, bool CreateSuspended)
        : TThread(CreateSuspended)
{
  Form = form;
}

void __fastcall ThPrueba::ActualizaLabel()
{
  Form->Label1->Caption = LS;
}


//---------------------------------------------------------------------------
void __fastcall ThPrueba::Execute()
{
  int n=0;
  while(!Terminated){
    LS = n++;
    Synchronize(ActualizaLabel);
    Sleep(500);
  }
}


Saludos.

NEG1414 05-02-2015 11:19:10

Muchas, Muchas Gracias por contestarme... Utilizare Synchrnize y os cuento..

Gracias Otra vez.


La franja horaria es GMT +2. Ahora son las 02:39:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi