Jump to content

Recommended Posts

Posted

Boas

tenho um problema que já dei muitas voltas e não consigo encontrar solução para ele  :wallbash:

se calhar a solução é muito básica mas já to tão a nora que não encontro

  • Tenho uma classe principal Window1 com um form;
  • Preciso que outra classe possa aceder a uma funçao da Window1 para escrever numa caixa de texto desse mesmo form.

Mas a classe Window1 chama a outra classe dentro de um backgroundworker...

Posted

😉

eu tenho uma função que inicializa o thread e chama a outra class, no entanto eu preciso que enquanto a segunda class está a correr que vá enviando strings para a textbox

private void Start_Click(object sender, RoutedEventArgs e)

{

      Process proc = new Process();

      _worker.WorkerReportsProgress = true;

      _worker.DoWork += delegate(object s, DoWorkEventArgs args)

        {

                BackgroundWorker worker = s as BackgroundWorker;

                proc.connect();

                if (worker.CancellationPending)

                {

                    args.Cancel = true;

                    return;

                }

            };

...

}

o meu problema é que não sei como fazer com que a class Process possa escrever na textbox, já experimentei utilizando delegate no entanto recebo a mensagem "O thread de chamada não pode aceder a este objecto porque existe outro thread que já o tem."

Posted

"O thread de chamada não pode aceder a este objecto porque existe outro thread que já o tem." Ou seja, só a thread que criou o controlo gráfico é que pode mudar o estado desse controlo. Como já disse, dentro do DoWork isso não é possível, apenas dentro dos outros 2 eventos que enunciei.

podes usar o método worker.ReportProgress(percentComplete); para reportar progresso, ou seja, disparar o evento ProgressChanged

podes, à semelhança do que fizeste para o DoWork, registar um delegate no ProgressChanged e nesse evento já podes mudar o texto da textbox porque esse evento já corre na thread que criou o controlo gráfico e não na thread de "background"

no DoWork vais enviando strings com o reportProgess e no ProgressChanged vais afectando o controlo, percebeste?

erro meu, o método reportProgress só recebe um valor inteiro :s

tens pelo menos 2 hipóteses, lançar vários backgroundworkers de modo a ir recebendo várias mensagens ou, se possível,  criar um esquema em que o inteiro passado no ReportProgress signifique que é para mostrar a mensagem X

Posted

hummm

to a ver que isto afinal é muito mais complicado doque parecia  😉

e assim não to a ver muito bem como posso fazer, pois preciso que a UI não fique bloqueado enquanto estou a correr as funções na segunda class no entanto tenho que fazer com que a textbox receba as strings, e se o reportProgress apenas recebe int não ajuda muito  :down:

por exemplo na segunda class preciso ter uma coisa genro

private void connect()

{

      for(int i=0; i<200;i++)

      {

              textbox.Text = "ai "+i;

      }

}

em que seja possível criar uma string e poder escreve la na texbox

Posted

Tenta assim:

private void connect()

{

      textBox1.Invoke(new EventHandler(ActualizarTextBox)); // textBox1 é a caixa que queres afectar

}

private void ActualizarTextBox(object sender, EventArgs e)

{

            TextBox tb = sender as TextBox;

            if (tb != null)

            {

                  string s; // ou stringBuilder para ficar como deve ser

                  for(int i=0; i<200;i++)

                  {

                          s = "ai "+i; // adaptar tb p o stringbuilder

                  }

                    tb.Text = s;

          }

}

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.