none
Manipulação e Gerenciamento de Threads RRS feed

  • Pergunta

  • Bom dia.

    Estou com o seguinte problema. Tenho uma aplicação onde tenho que executar 2 formulários distintos e ao mesmo tempo (um é o meu principal e outro uma barra de alarmes) para isso usei threads, no meu caso crio uma nova thread do formulário de barra de alarmes quando o meu principal é carregado. Até ai tudo bem, a questão é o seguinte esta acontecendo 2 problemas "graves". Pela lógica quando eu fechar o formulário principal minha barra de alarmes tem que fechar junto.

    1º problema: meu formulário principal no método Form_Closed() eu dou uma Abort() na thread e ela finaliza, usando Win 7 tudo ocorre corretamente mas quando rodo minha aplicação em um WinXP ela trava.

    2º problema: no formulário de barra de alarmes tenho que fazer certas verificações quando fecho o mesmo (Form_Closed()) e isso não esta acontecendo, ou seja, quando dou um Abort() no formulário principal minha rotina do Form_Closed() da barra de alarmes não esta executando.

    sexta-feira, 2 de dezembro de 2011 10:50

Respostas

  • Pessoal, achei a resposta.

    No meu formulario principal criei a classe

    public class CL_ControladorBarraAlarmes
    {
            FM_BarraAlarmes FML_BarraAlarmes = new FM_BarraAlarmes();
    
            public void AbrirBarraAlarmes()
            {
                Application.Run(FML_BarraAlarmes);
            }
    
            public void FecharBarraAlarmes()
            {
                FML_BarraAlarmes.ComandoFecharBarraAlarmes();
            }
    }
    

    No meu formulário de Barra de Alarmes criei um delegate.

    delegate void ControleFechamentoFormulario(Control oControl);
    
    public void ComandoFecharBarraAlarmes()
    {
          RequerimentoParaFechar(this);
    }
    
    private void RequerimentoParaFechar(Control oControl)
    {
          if (oControl.InvokeRequired)
          {
              ControleFechamentoFormulario delegaFecha = new ControleFechamentoFormulario(RequerimentoParaFechar);
              oControl.Invoke(delegaFecha, new object[] { oControl });
          {
          else
              Close();
    }
    

    Ai criei um objeto para a classe CL_ControladorBarraAlarmes e desse modo posso controlar a criação e o fechamento do formulário, mesmo ele sendo produzido em outra Thread.

    segunda-feira, 5 de dezembro de 2011 15:37

Todas as Respostas

  • n entendi.
    "Desenvolvendo..."
    sexta-feira, 2 de dezembro de 2011 13:02
  • Vou tentar explicar denovo. Tenho 2 formularios rodando em paralelo (Principal e Barra de Alarmes). Quero executar os dois ao mesmo tempo, sendo que o Principal iria criar a Barra de Alarmes.

    Bem no formulário tenho o método Form_Closed() que obrigatoriamente tem que ser executado.

    Pela lógica quando eu fechar meu formulario Principal tenho que fechar minha Barra de Alarmes.

    Então, quando o Principal é fechado estou dando um Abort() na thread da Barra de Alarmes, a mesma fecha, mas não executava o Form_Closed() dela.

    Entendeu o problema?

    sexta-feira, 2 de dezembro de 2011 13:52
  • já tentou um disparar o Close e associar evento Form Closed da Barra e você abortar a thread?

     

     

    "Desenvolvendo..."

    sexta-feira, 2 de dezembro de 2011 13:58
  • Sim, mas como estou trabalhando com threads não posso acessar esse tipo de comando sendo ela foi criada por um outro meio. Da um erro.
    sexta-feira, 2 de dezembro de 2011 14:18
  • Pessoal, achei a resposta.

    No meu formulario principal criei a classe

    public class CL_ControladorBarraAlarmes
    {
            FM_BarraAlarmes FML_BarraAlarmes = new FM_BarraAlarmes();
    
            public void AbrirBarraAlarmes()
            {
                Application.Run(FML_BarraAlarmes);
            }
    
            public void FecharBarraAlarmes()
            {
                FML_BarraAlarmes.ComandoFecharBarraAlarmes();
            }
    }
    

    No meu formulário de Barra de Alarmes criei um delegate.

    delegate void ControleFechamentoFormulario(Control oControl);
    
    public void ComandoFecharBarraAlarmes()
    {
          RequerimentoParaFechar(this);
    }
    
    private void RequerimentoParaFechar(Control oControl)
    {
          if (oControl.InvokeRequired)
          {
              ControleFechamentoFormulario delegaFecha = new ControleFechamentoFormulario(RequerimentoParaFechar);
              oControl.Invoke(delegaFecha, new object[] { oControl });
          {
          else
              Close();
    }
    

    Ai criei um objeto para a classe CL_ControladorBarraAlarmes e desse modo posso controlar a criação e o fechamento do formulário, mesmo ele sendo produzido em outra Thread.

    segunda-feira, 5 de dezembro de 2011 15:37