none
Para um Thread RRS feed

  • Pergunta

  • Olá, tenho um form com progressbar para indicar atividade que é aberto quando começo a popular um datagrid.

    Peguei um código aqui no MSDN e adaptei para minha necessidade, funcionou perfeitamente, mas a surgiu uma dúvida:

    Quando o form que é aberto em uma thread separada é fechado, automaticamente para a thread ou tenho que informar o fim dela?

    Segue código:

    public partial class frmConsultaProduto : GUI.frmModeloConsulta
        {
            private frmLoading loading = new frmLoading();
            private delegate void FechaPopUp();
    
            public int codigo = 0;
            public frmConsultaProduto()
            {
                InitializeComponent();
            }
            
            private void btnLocalizar_Click(object sender, EventArgs e)
            {
                ProcessarInfo();
                try
                {
                    DALConexao cx = new DALConexao(DadosDaConexao.StringDeConexao);
                    BLLProduto bll = new BLLProduto(cx);
                    dgvConsProduto.DataSource = bll.Localizar(txbConsNome.Text);
                    dgvConsProduto.Columns[0].HeaderText = "Código";
                    dgvConsProduto.Columns[0].Width = 60;
                    dgvConsProduto.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;              
                    dgvConsProduto.Columns[1].HeaderText = "Produto";
                    dgvConsProduto.Columns[1].Width = 100;
                    dgvConsProduto.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;                
                    dgvConsProduto.Columns[2].HeaderText = "Descrição Longa";
                    dgvConsProduto.Columns[2].Width = 300;
                    dgvConsProduto.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                    dgvConsProduto.Columns[3].HeaderText = "Foto";
                    dgvConsProduto.Columns[3].Width = 60;
                    dgvConsProduto.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                    dgvConsProduto.Columns[4].HeaderText = "Valor Pago";
                    dgvConsProduto.Columns[4].Width = 100;
                    dgvConsProduto.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                    dgvConsProduto.Columns[5].HeaderText = "Valor Venda";
                    dgvConsProduto.Columns[5].Width = 100;
                    dgvConsProduto.Columns[5].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                    dgvConsProduto.Columns[6].HeaderText = "Quant.";
                    dgvConsProduto.Columns[6].Width = 100;
                    dgvConsProduto.Columns[6].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                    dgvConsProduto.Columns[7].HeaderText = "Unid. Med.";
                    dgvConsProduto.Columns[7].Width = 85;
                    dgvConsProduto.Columns[7].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                    dgvConsProduto.Columns[8].HeaderText = "Grupo";
                    dgvConsProduto.Columns[8].Width = 150;
                    dgvConsProduto.Columns[8].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                    dgvConsProduto.Columns[9].HeaderText = "Sub Grupo";
                    dgvConsProduto.Columns[9].Width = 150;
                    dgvConsProduto.Columns[9].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
    
                    this.Invoke(new FechaPopUp(this.FecharPopUp));
                }
                catch (Exception erro)
                {
                    this.Invoke(new FechaPopUp(this.FecharPopUp));
                    MessageBox.Show(erro.Message);
                }
            }
    
            private void dgvConsProduto_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.RowIndex >= 0)
                {
                    this.codigo = Convert.ToInt32(dgvConsProduto.Rows[e.RowIndex].Cells[0].Value);
                    this.Close();
                }
            }
    
            private void ProcessarInfo()
            {
                Thread thProcessa = new Thread(Open_Forn);
                thProcessa.Start();
               
            }
    
            private void Open_Forn()
            {
                loading.ShowDialog();
            }
    
            private void FecharPopUp()
            {
                loading.Close();
            }
        }
    }

    Desde já agradeço.

    abçs;

     



    sábado, 5 de agosto de 2017 20:49

Respostas

  • Cleber, nao é preciso. Ao fechar a tela aberta como diálogo a thread é finalizada. Caso queira garantir que ela seja finalizada, seria necessário declarar a variavel da thread no escopo da classe e inicializar na função ProcessarInfo() e na função FecharPopUp parar a thread e descarregar a variável. Mas não muda em nada ja que a thread é finalizada naturalmente. Apos o GC do Framework limpar a memoria sua aplicação não terámais nada em memoria.
    sábado, 5 de agosto de 2017 22:50

Todas as Respostas

  • Cleber, nao é preciso. Ao fechar a tela aberta como diálogo a thread é finalizada. Caso queira garantir que ela seja finalizada, seria necessário declarar a variavel da thread no escopo da classe e inicializar na função ProcessarInfo() e na função FecharPopUp parar a thread e descarregar a variável. Mas não muda em nada ja que a thread é finalizada naturalmente. Apos o GC do Framework limpar a memoria sua aplicação não terámais nada em memoria.
    sábado, 5 de agosto de 2017 22:50
  • Olá Edgar,

    Obrigado pela resposta.
    Sou iniciante (curioso) em programação, e pretendo me aprofundar mais nos estudos.

    Mais uma vez obrigado.

    vlw.

    domingo, 6 de agosto de 2017 19:30