2013年5月6日 星期一

Invoke((MethodInvoker))關於調用外部控制項

假如 今天程式呼叫委派的執行過程中
在委派中 同時又要控制 外部控制項
首先 基礎的初學者通常語法大概長這樣如下

private void button9_Click(object sender, EventArgs e)
        {//建立無傳入參數的委派物件GO
            MethodInvoker GO = new MethodInvoker(sshh);
            Invoke(GO);//開始執行GO委派物件
        }

        public void sshh()
        {//將外部控制向屬性,打入已執行
            label6.Text = "已執行";
        }

進階的話 有人會使用匿名法  一時難以理解   CODE如下


private void button9_Click(object sender, EventArgs e)
        {
            Invoke((MethodInvoker)delegate{label5.Text="已執行";});
        }

再來如果今天 觸發INVOK不是 BUTTON的話而是
方法或委派或多程序
我們就要..
範例如下

private void button11_Click(object sender, EventArgs e)
        {
            Thread po = new Thread(new ThreadStart(Dooo));
            po.Start();
        }
        public void Dooo()
        {
            MethodInvoker ee = new MethodInvoker(delegate { label6.Text = "SSSSS"; });
            Invoke(ee);
        }
也可以在縮寫如下

Invoke((MethodInvoker)delegate { label6.Text = "WWW"; });
再來更進階一點的範例
比如說 方塊又戲中的  時鐘 或 計時器
計時一分鐘
我們用多程序來執行時鐘 並SHOW到LABLE上
計時器範例如下

private void button10_Click(object sender, EventArgs e)
        {//建立多程序 G,多程序啟動委派匿名方式
            Thread G = new System.Threading.Thread(delegate()
                {
                    int P_int_count = 0;//宣告整數當作秒數累加計時器用
                    while (true)//開始無限循環
                    {//計數累加1之後做判斷,三元判斷
                        //++P_int_count 先+1才做判斷喔~
                        //如果P_int_count沒超過100000000的話 判斷為P_int_count自己
                        P_int_count = ++P_int_count > 100000000 ? 0 : P_int_count;
                        //再利用INVOKE啟動,匿名委派中的方法 而方法再去控制外部LABLE
                        Invoke((MethodInvoker)delegate { label7.Text = P_int_count.ToString(); });
                        System.Threading.Thread.Sleep(1000);//睡眠1秒在重複執行
                    }
                }
                );
            G.Start();//開始執行多程序
        }

沒有留言:

張貼留言