zoukankan      html  css  js  c++  java
  • [2014-9-15]异步委托线程高级

    昨天悲剧,帮别人调代码,愣没调出来。还没时间写博文了。 忧桑...

    昨天的今天写吧,今天也没学,就上了一天的课、

    1 首先窗口间数据进行传递。也就是父窗口与子窗口数据进行传递。

    用委托实现

    ①,在同一命名控件下定义委托。

    ②,在子窗口创建委托实例。

    ③,在父窗口创建子窗口对象,传递委托方法。

     public delegate void SetString(string str);
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.Text = Thread.CurrentThread.ManagedThreadId.ToString();
                //允许其他线程来访问
               // Control.CheckForIllegalCrossThreadCalls = false;
            }

            private void btnMain_Click(object sender, EventArgs e)
            {
                FChild fChild = new FChild();
                fChild.SetStr = new SetString(set);
                fChild.Show();
            }
            private void set(string str)

            {

                 this.txtMain.Text=str;
             }
        }

    子窗口:

            public FChild()
            {
                InitializeComponent();
                this.Text = Thread.CurrentThread.ManagedThreadId.ToString();
            }
            public SetString SetStr;

            private void btnChild_Click(object sender, EventArgs e)
            {
                SetStr(this.txtChild.Text);
            }

    用多线程实现:

       线程之间传递在不同窗口之间不能传递,也就是允许其他线程来访问 当前线程创建的控件

      Control.CheckForIllegalCrossThreadCalls = false;//不推荐这个方法

     使用Invoke()方法

    public delegate void SetTextDel(string txt);

        public partial class MainFrm : Form
        {
            private SetTextDel MySetCotrolTxt4OtherThreadDel;

            public MainFrm()
            {
                InitializeComponent();

                this.Text = Thread.CurrentThread.ManagedThreadId +"";

                //允许其他线程来访问 当前线程创建的 控件:Control
                //掩耳盗铃
                //Control.CheckForIllegalCrossThreadCalls = false;

                MySetCotrolTxt4OtherThreadDel = new SetTextDel(this.SetText4OtherThread);
            }

            private void button1_Click(object sender, EventArgs e)
            {
                //ChildFrm frm = new ChildFrm();
                //frm._SetTextDel = new SetTextDel(SetText);
                //frm.Show();

                Thread thread = new Thread(()=>
                                               {
                                                   ChildFrm frm = new ChildFrm();
                                                   frm._SetTextDel = new SetTextDel(SetText);
                                                   frm.ShowDialog();
                                               });
                thread.Start();
            }

            public void SetText(string txt)
            {
                //InvokeRequired 当线程执行到此的时候,校验一下txtMessage控件是哪个线程创建的。如果是自己创建的InvokeRequired:fasle反之则为true
                if(this.txtMessage.InvokeRequired)
                {
                    this.Invoke(MySetCotrolTxt4OtherThreadDel, txt);
                }
                else
                {
                    this.txtMessage.Text = txt;  
                } 
            }

            public void SetText4OtherThread(string strTxt)
            {
                this.txtMessage.Text = strTxt;
            }
        }

  • 相关阅读:
    Adding iAds to Cocos2d-x on iOS
    让游戏支持复杂手势识别
    【ybtoj高效进阶 21285】独立生物(图论)(博弈论)(DP)
    【ybtoj高效进阶 21286】等差数列(数学)(分类讨论)
    【ybtoj高效进阶 21278】内需消费(线段树)(广义矩阵乘法)(DP)
    【ybtoj高效进阶 21277】逆序对数(数学)(DP)
    【ybtoj高效进阶 21274】相似序列(主席树)(哈希)(二分)
    【ybtoj高效进阶 21273】铲雪问题(树形DP)
    【ybtoj高效进阶 21272】生命游戏(bfs)(二分)
    【ybtoj高效进阶 21270】三只企鹅(树链剖分)(线段树)
  • 原文地址:https://www.cnblogs.com/wuyuetian/p/3973581.html
Copyright © 2011-2022 走看看