none
MultiThread X Construtor WinForms RRS feed

  • Pergunta

  • Vai ser meio dificil de explicar, mas vamos lá!

    Tenho um objeto Socket (Envio/Recebimento) que é processado por um outro objeto (Tratamento) que trata os dados recebidos pelo socket, só que a aplicação é Winforms e então algumas vezes o objeto Tratamento tem de manipular um formulario ou outro (Através de delegates) e eu observei uns problemas mistériosos que acontece com os formulários que recebem o objeto Tratamento via construtor (new frmComunicacao(Tratamento tconexao)) e neste objeto tratamento esta funcionando em uma thread diferente do formulário.

    A pergunta será, como passar o Tratamento para o formulário:

    a) new frmComunicacao(Tratamento tconexao);

    b) comunicacao.TrataConexao = tconexao.

     

    Atenciosamente,

    Nilo Ferreira

     

    quarta-feira, 30 de maio de 2007 11:29

Todas as Respostas

  • Você quer saber como passar a mensagem qe você recebeu no socket para um objeto na tela???

     

    Bem, se for isso, fassa o seguinte:

     

    Code Snippet

          private void ShowText(string text)
            {
                if (this.TextBox1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(ShowText);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.TextBox1.Text = text;
                }
            }

     

    Você também pode usar essa função para passar os dados para uma variável do form.

     

    A questão é que existe uma única thread para executar tudo que acontece no form, e você precisa passar o comando para essa thread executar (mais ou menos isso)...

    quarta-feira, 30 de maio de 2007 11:55
  • Não... isso eu já estou fazendo... eu quero saber como eu envio para o form o objeto de tratamento de mensagem, por construtor ou por propriedade?!

     

    quarta-feira, 30 de maio de 2007 13:22
  • Sim entendi. Acredito que a melhor forma é por construtor. Basta você fazer o invoquerequired correto para cada ação.
    quarta-feira, 30 de maio de 2007 13:55
  • Você pode passar o objeto no construtor do formulário. Qual o problema misterioso que ocorreu?
    quarta-feira, 30 de maio de 2007 15:02
  • O erro é esse:
    System.NullReferenceException: Referência de objeto não definida para uma instância de um objeto.
       at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
       at System.Windows.Forms.Control.DefWndProc(Message& m)
       at System.Windows.Forms.Control.WmUpdateUIState(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at System.Windows.Forms.ContainerControl.WndProc(Message& m)
       at System.Windows.Forms.ParkingWindow.WndProc(Message& m)
       at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
     
    Isso ocorre qdo eu instancio o formulario, antes mesmo do show(), ele ocorre apenas em formularios que eu passo o Tratamento no construtor. 
    No construtor eu faço apneas o seguinte. 
    this.TrataConexao = TConexao;
    quarta-feira, 30 de maio de 2007 17:47
  • Ok, coloque um break point na linha: "this.TrataConexao = TConexao" e veja se o objeto TConexao não está Null. Se ele estiver, o problema é esse.
    quarta-feira, 30 de maio de 2007 18:06