none
Abrir outro form - Thread C# RRS feed

  • Pergunta

  • Bom dia, 

    Eu estou desenvolvendo uma solução em WinForms, e preciso abrir dois forms, um deles através de uma outra Thread.

    Alguém pode me ajudar?


    • Editado Rooh Campos quarta-feira, 9 de julho de 2014 18:14
    quarta-feira, 9 de julho de 2014 17:43

Todas as Respostas

  • Vê se isso te ajuda.

    private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(Open_Form);   
           t.start();
          Thread.Sleep (500);          // pausa por 500 milliseconds
    
        }
    
    
    public void Open_Form()
    {
    Form1.Show();
    }
    
         

    quarta-feira, 9 de julho de 2014 18:20
  • Supimpa,

    Não ajudou, ele dá um erro e fecha o programa.


    • Editado Rooh Campos quarta-feira, 9 de julho de 2014 18:26
    quarta-feira, 9 de julho de 2014 18:23
  • Segue código completo e testado.

    Caso não funcione, poste o código do seu programa.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace Test_form
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
            Form2 form2 = new Form2();
           
            public void Open_Form()
            {
    
                if (Application.OpenForms.OfType<Form2>().Count() > 0)
                {
                    MessageBox.Show("Formulário já está aberto");
                }
                else
                {
                    form2.Text = "Teste";
                    form2.Show();
                    Application.Run(form2);
                }
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread t = new Thread(Open_Form);
                t.Start();
                Thread.Sleep(500);
            }
    
    
        }
    }
    
    
    


    • Editado Supimpa quarta-feira, 9 de julho de 2014 22:41
    quarta-feira, 9 de julho de 2014 21:13
  • Supimpa,

    O que eu preciso fazer é um pouco diferente, eu tenho um form e dentro dele preciso abrir outros 2.

    O problema é que tenho dois equipamentos e preciso conectá-los em forms diferentes, só que quando abro esses dois forms, eles conectam em um só, e não cada um em um.

    Segue o Código

     public partial class frmGeral : Form
        {
    
            frmMerenda frmMerenda = new frmMerenda();
    
            public frmGeral()
            {
                InitializeComponent();
            }
    
            private void frmGeral_Load(object sender, EventArgs e)
            {
                ChamarFrmAcesso();
    
                Thread t = new Thread(ChamarFrmMerenda);
                t.Start();
    
                Thread.Sleep(500); 
            }
    
            private void frmGeral_FormClosing(object sender, FormClosingEventArgs e)
            {
                Dispose();
                Application.Exit();
            }
    
            public void ChamarFrmMerenda()
            {
                frmMerenda.Show();
                Application.Run(frmMerenda);
    
            }
    
            private void ChamarFrmAcesso()
            {
                frmAcesso frmAcesso = new frmAcesso();
                frmAcesso.MdiParent = this;
                frmAcesso.Show();
            }
            
        }

     

    quinta-feira, 10 de julho de 2014 12:44
  • Ainda não tive este tipo de problema com Forms, mas tente desta forma.

     public partial class frmGeral : Form
        {

    Form form_padrao; //Crie um objeto do tipo form.

    public void ChamarFrmMerenda() {

    //Faça com que toda vez que chamar um formulário, seja criado uma nova instância do objeto.

    //para receber o novo Form

    form_padrao = new frmMerenda().

    form_padrao.Show(); Application.Run(form_padrao); }

    Este problema pode estar ocorrêndo por estarem acessando a mesma instância do objeto ou classe.

    Caso o modo acima não dê certo, tente criar uma nova instância do Thread.

    Thread thread = new Thread(new ThreadStart(ChamarFrmMerenda));
    thread.Start();



    • Editado Supimpa quinta-feira, 10 de julho de 2014 18:18
    quinta-feira, 10 de julho de 2014 18:11
  • Na hora que eu mando rodar o programa, ele diz que não consegue responder e fecha.

    Obrigado

    segunda-feira, 14 de julho de 2014 12:52
  • Na hora que eu mando rodar o programa, ele diz que não consegue responder e fecha.

    Obrigado

    Rooh,

     como está seu código agora ?

    segunda-feira, 14 de julho de 2014 12:59
  • Daniel,

    O meu código está exatamente como postei acima.

    segunda-feira, 14 de julho de 2014 13:05
  • Daniel,

    O meu código está exatamente como postei acima.

    Ficaria mais ou menos assim, você vai ter que retirar o Parent de seu form ou vai precisar usar Thread-Safe :

     public partial class frmGeral : Form
        {
    
            frmMerenda frmMerenda;
    
            public frmGeral()
            {
                InitializeComponent();
            }
    
            private void frmGeral_Load(object sender, EventArgs e)
            {
                ChamarFrmAcesso();
    
                Thread t = new Thread(ChamarFrmMerenda);
                t.Start();
    
               // Thread.Sleep(500); 
            }
    
            private void frmGeral_FormClosing(object sender, FormClosingEventArgs e)
            {
                Dispose();
                Application.Exit();
            }
    
            public void ChamarFrmMerenda()
            {
                frmMerenda = new FrmMerenda();
                frmMerenda.Show();
                Application.Run(frmMerenda);
    
            }
    
            private void ChamarFrmAcesso()
            {
                frmAcesso frmAcesso = new frmAcesso();
               // frmAcesso.MdiParent = this;
                frmAcesso.Show();
            }
            
        }
     Teste desse modo !


    • Editado Daniel Brito br segunda-feira, 14 de julho de 2014 13:13 Comentario retirado.
    segunda-feira, 14 de julho de 2014 13:12
  • Daniel, 

    Retirando o Parent ele continuou dando erro.

    Nesse projeto, eu preciso do Parent, porque como abro mais forms, ele ira abrir varias janelas, ficando desorganizado pro cliente.


    segunda-feira, 14 de julho de 2014 13:18
  • Daniel, 

    Retirando o Parent ele continuou dando erro.

    Nesse projeto, eu preciso do Parent, porque como abro mais forms, ele ira abrir varias janelas, ficando desorganizado pro cliente.


     Mas eu alterei a instância de seu Form também ! Copie e cole o código conforme eu fiz !
    segunda-feira, 14 de julho de 2014 13:20
  • Daniel, 

    Retirando o Parent ele continuou dando erro.

    Nesse projeto, eu preciso do Parent, porque como abro mais forms, ele ira abrir varias janelas, ficando desorganizado pro cliente.


     Mas eu alterei a instância de seu Form também ! Copie e cole o código conforme eu fiz !

    Ainda deu o erro, copiei seu código e colei.


    segunda-feira, 14 de julho de 2014 13:26
  • Rooh,

     você sabe debugar, esse erro pode ser em seu form que está abrindo, sabe em qual linha gera o erro ? Pois isso deveria ter funcionado ! 

    segunda-feira, 14 de julho de 2014 13:46
  • Daniel,

    O erro ele só gera ao rodar o programa, então não tem como saber a linha.

    Eu não sei se pode ser isso, mas em cada form eu uso uma dll para usar biometria, não sei se ele pode estar dando conflito por eu usar a mesma.


    segunda-feira, 14 de julho de 2014 13:50
  • Daniel,

    O erro ele só gera ao rodar o programa, então não tem como saber a linha.

    Eu não sei se pode ser isso, mas em cada form eu uso uma dll para usar biometria, não sei se ele pode estar dando conflito por eu usar a mesma.


    Rooh,

     não tem jeito só colocando um breakPoint com a tecla F9 e ir vendo passo a passo usando F10 para verificar onde gera o erro faça isso coloque um breakpoint e veja onde gera o erro, sem debug não tem como mesmo saber o que está ocorrendo !

    segunda-feira, 14 de julho de 2014 14:06
  • Daniel,

    O erro acontece quando eu seto a porta que meu equipamento vai acessar, ai ele fecha o programa.

    segunda-feira, 14 de julho de 2014 14:30
  • Daniel,

    O erro acontece quando eu seto a porta que meu equipamento vai acessar, ai ele fecha o programa.

    Entendi,

     mas qual erro é gerado e onde está o código que faz isso !

    segunda-feira, 14 de julho de 2014 14:35
  • Rooh, você precisa corrigir essas instâncias do formulário.

    frmAcesso frmAcesso = new frmAcesso();

    Vc não pode usar o nome do Objeto para instânciar em uma variável com o mesmo Nome.

    Altere esta linha:  frmAcesso frmAcesso = new frmAcesso();
    
    Para:  frmAcesso frmacesso = new frmAcesso();   //frmacesso


    ou qualquer outro nome que a variável que recebe a instância do formulário fique diferente.

    Acho que por isso que está apresentando o erro.

    Esta declaração de tipo de variável também não está correta.

     frmMerenda frmMerenda;

    Vc precisa declarar um variável do tipo objeto ou Form para que possa usa-lá para receber a instância do formulário e não podem ter o mesmo nome.

    Poste o código e o nome de cada Form para que possamos te ajudar.


    • Editado Supimpa segunda-feira, 14 de julho de 2014 17:32
    segunda-feira, 14 de julho de 2014 17:31