输入到不同类C#的文本框

时间:2013-03-17 12:38:46

标签: c# multithreading forms class textbox

我不想为这个分配提供完整的代码,但我的主要问题是从Program.cs中的类中获取文本以显示在Form.cs的文本框中。我已经尝试了几乎所有的东西,我似乎仍然无法让它工作。我真的只想将Hello类中的文本显示在表单类的文本框中。这就是我现在所拥有的

Program.cs - 主要代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;

namespaceWindows
{

static class Program
{

    public static Form1 form;
    [STAThread]

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Thread thread1 = new Thread(new ThreadStart(open));
        thread1.Start();
        Thread thread2 = new Thread(new ThreadStart(open));
        thread2.Start();

    }

    static void openForms()
    {

        form = new Form1();
        form.ShowDialog();
        Program1 p = new Program1();


    }
   }

public class Program1
{
   private HELLO h;
   public Program1()
    {


        h = new HELLO();
    }
}

public class HELLO
{
  public HELLO()
  {
   Program.form.ThreadSafe("Hello ");
  }

 }
}

Form1.cs - 文本框

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;

namespace Windows
{
public partial class Form1 : Form
{
    string input;
    public delegate void SetTextCallback(string text);

    public Form1()
    {
        InitializeComponent();
    }



    public void ThreadSafe(string text)
    {

        if (this.screenTextBox.InvokeRequired)
        {
            // It's on a different thread, so use Invoke.
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text + " (Invoke)" });
        }
        else
        {
            // It's on the same thread, no need for Invoke
            this.screenTextBox.Text = text + " (No Invoke)";

        }
    }



    // This method is passed in to the SetTextCallBack delegate
    // to set the Text property of textBox1.
    private void SetText(string text)
    {
        this.screenTextBox.Text = text;
    } 

  }

我知道代码可能没有意义,但这主要是因为我必须编辑它,因为我无法在此处发布我的作业代码。任何人都可以看到我的问题是什么?为什么文本在打开时不会显示在表单中,我已经在线尝试了多种解决方案,但仍然没有。

1 个答案:

答案 0 :(得分:0)

当你致电form.ShowDialog();申请主线程将在此处停止并Program1 p = new Program1();在形式关闭事件调用之前不会运行。

Program.cs的

static class Program
    {

        [STAThread]

        static void Main()
        {

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Thread thread1 = new Thread(new ThreadStart(openForms));
            thread1.SetApartmentState(ApartmentState.STA);
            thread1.Start();
        }
        static Form1 frm;
        static void openForms()
        {
             frm = new Form1();
             Program1 p = new Program1();
             Application.Run(frm);
        }

        public class Program1
        {
            private HELLO h;
            public Program1()
            {
                h = new HELLO();
            }
        }

        public class HELLO
        {
            public HELLO()
            {
                frm._Form1.ThreadSafe("Hello ");
            }

        }
    }

Form1.cs的

 public partial class Form1 : Form
    {
        public Form1 _Form1;
        string input;
        public delegate void SetTextCallback(string text);

        public Form1()
        {
            InitializeComponent();
            _Form1 = this;
        }

        public void ThreadSafe(string text)
        {
            if (this.screenTextBox.InvokeRequired)
            {
                // It's on a different thread, so use Invoke.
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text + " (Invoke)" });
            }
            else
            {
                // It's on the same thread, no need for Invoke
                this.screenTextBox.Text = text + " (No Invoke)";

            }
        }



        // This method is passed in to the SetTextCallBack delegate
        // to set the Text property of textBox1.
        private void SetText(string text)
        {
            this.screenTextBox.Text = text;
        } 
    }

编辑两个帖子

Program.cs的

static class Program
    {

        [STAThread]

        static void Main()
        {

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Thread thread1 = new Thread(new ThreadStart(openForms));
            thread1.SetApartmentState(ApartmentState.STA);
            thread1.Start();
            Thread thread2 = new Thread(new ThreadStart(openForms));
            thread2.SetApartmentState(ApartmentState.STA);
            thread2.Start();
        }

        static void openForms()
        {
             Form1 frm = new Form1();
             Program1 p = new Program1();
             Application.Run(frm);
        }

        public class Program1
        {
            private HELLO h;
            public Program1()
            {
                h = new HELLO();
            }
        }

        public class HELLO
        {
            public HELLO()
            {
                Form1._Form1.ThreadSafe("Hello ");
            }

        }
    }

Form1.cs的

  public partial class Form1 : Form
    {
        public static Form1 _Form1;
        string input;
        public delegate void SetTextCallback(string text);

        public Form1()
        {
            InitializeComponent();
            _Form1 = this;
        }

        public void ThreadSafe(string text)
        {
            Thread.Sleep(100);
            if (this.screenTextBox.InvokeRequired)
            {
                // It's on a different thread, so use Invoke.
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text + " (Invoke)" });
            }
            else
            {
                // It's on the same thread, no need for Invoke
                this.screenTextBox.Text = text + " (No Invoke)";

            }
        }



        // This method is passed in to the SetTextCallBack delegate
        // to set the Text property of textBox1.
        private void SetText(string text)
        {
            this.screenTextBox.Text = text;
        } 
    }