• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 224  文章 - 41  trackbacks - 0
            <2012年5月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            享受編程

            常用鏈接

            留言簿(11)

            隨筆分類(159)

            隨筆檔案(224)

            文章分類(2)

            文章檔案(4)

            經(jīng)典c++博客

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            原文地址:http://hi.baidu.com/%D0%A1%B0%D7%C1%B3%B5%C4%D2%B6%D7%D3/blog/item/a69dc6d2c7b3190b3af3cf8f.html

            在設(shè)計(jì)中為了讓界面與邏輯分離,我的做法是使用事件,界面只要響應(yīng)事件來處理界面的顯示就行了。而事件在邏輯處理中可能由不同的線程引發(fā),這些事件的響應(yīng)方法在修改界面中的控件內(nèi)容時(shí)便會(huì)引發(fā)一個(gè)異常。

            這時(shí)就用到了Control.InvokeRequired 屬性 與Invoke方法。

            MSDN中說:
            獲取一個(gè)值,該值指示調(diào)用方在對(duì)控件進(jìn)行方法調(diào)用時(shí)是否必須調(diào)用 Invoke 方法,因?yàn)檎{(diào)用方位于創(chuàng)建控件所在的線程以外的線程中。
            如果控件的 Handle 是在與調(diào)用線程不同的線程上創(chuàng)建的(說明您必須通過 Invoke 方法對(duì)控件進(jìn)行調(diào)用),則為 true;否則為 false。
            Windows 窗體中的控件被綁定到特定的線程,不具備線程安全性 。因此,如果從另一個(gè)線程調(diào)用控件的方法,那么必須使用控件的一個(gè) Invoke 方法來將調(diào)用封送到適當(dāng)?shù)木€程。該屬性可用于確定是否必須調(diào)用 Invoke 方法,當(dāng)不知道什么線程擁有控件時(shí)這很有用。

            下面來說下這個(gè)的用法(我的一般做法):
            首先定義一個(gè)委托,與這個(gè)事件處理函數(shù)的簽名一樣委托,當(dāng)然直接使用該事件的委托也是可以的,如:

             

            private   delegate   void InvokeCallback( string msg); 


            然后就是判斷這個(gè)屬性的值來決定是否要調(diào)用Invoke函數(shù):

             

            void m_comm_MessageEvent( string msg)
                  {
                 if (txtMessage.InvokeRequired)
                   {
                 InvokeCallbackmsgCallback =   new InvokeCallback(m_comm_MessageEvent);
                  txtMessage.Invoke(msgCallback, new   object []   { msg } );
                } 
                 else 
                   {
                 txtMessage.Text = msg;
                } 
               } 


            說明:這個(gè)函數(shù)就是事件處理函數(shù),txtMessage是一個(gè)文本框。
            這樣就做到了窗體中控件的線程安全性。

            ------------------

            InvokeRequired 當(dāng)前線程不是創(chuàng)建控件的線程時(shí)為true
            比如你可以自己開一個(gè)Thread,或使用Timer的事件來訪問窗體上的控件的時(shí)候,在線程中窗體的這個(gè)屬性就是True的。

            簡(jiǎn)單的說,如果有兩個(gè)線程,Thread A和Thread B,并且有一個(gè)Control c,是在Thread A里面new的。
            那么在Thread A里面運(yùn)行的任何方法調(diào)用c.InvokeRequired都會(huì)返回false。
            相反,如果在Thread B里面運(yùn)行的任何方法調(diào)用c.InvokeRequired都會(huì)返回true。
            是否是UI線程與結(jié)果無關(guān)。(通常Control所在的線程是UI線程,但是可以有例外)

            也可以認(rèn)為,在new Control()的時(shí)候,control用一個(gè)變量記錄下了當(dāng)前線程,在調(diào)用InvokeRequired時(shí),返回當(dāng)前線程是否不等于new的時(shí)候記錄下來的那個(gè)線程。

            --------------------

            我理解:如果InvokeRequired==true表示其它線程需要訪問控件,那么調(diào)用invoke來轉(zhuǎn)給控件owner處理。

            ps:C#多線程學(xué)習(xí)
            http://www.cnblogs.com/xugang/archive/2008/04/06/1138856.html

            using System;
            using System.Collections.Generic;
            using System.ComponentModel;
            using System.Data;
            using System.Drawing;
            using System.Text;
            using System.Windows.Forms;
            using System.Threading;

            namespace WinThreadNew
            {
                
            public partial class WinThreadNew : Form
                
            {
                    
            int pro = 0;
                    Thread backWork 
            = null;
                    
            public WinThreadNew()
                    
            {
                        InitializeComponent();
                    }


                    
            private void btnStart_Click(object sender, EventArgs e)
                    
            {
                        backWork 
            = new Thread(new ThreadStart(doWork));
                        backWork.Start();
                    }


                    
            public delegate void DelegateUpdateUIPro();
                    
            private void doWork()
                    
            {
                        
            for (int i = 0; i < 100; i++ )
                        
            {
                            pro
            ++;
                            UpdateUIPro();
                            Thread.Sleep(
            100);
                        }

                        
                    }


                    
            private void UpdateUIPro()
                    
            {
                        
            if (this.InvokeRequired)
                        
            {
                            
            this.BeginInvoke(new DelegateUpdateUIPro(UpdateUIPro));
                        }
             
                        
            else
                        
            {
                            
            this.lblPro.Text = pro.ToString() + "%";
                        }

                    }


                    
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
                    
            {
                        
            this.backWork.Abort();
                        
            this.backWork.Join();
                    }

                }

            }
            posted on 2010-08-31 21:24 漂漂 閱讀(21357) 評(píng)論(0)  編輯 收藏 引用 所屬分類: c#開發(fā)
            狠狠色伊人久久精品综合网 | 久久精品综合一区二区三区| 久久久久亚洲AV无码专区首JN | 亚洲成av人片不卡无码久久| 国产日产久久高清欧美一区| 久久伊人精品青青草原高清| 无码国内精品久久人妻麻豆按摩 | 中文国产成人精品久久亚洲精品AⅤ无码精品| 国产亚州精品女人久久久久久| 久久久久99精品成人片| 久久亚洲AV成人无码软件| 狠狠久久亚洲欧美专区 | 性欧美丰满熟妇XXXX性久久久 | 99久久国产综合精品网成人影院| 久久电影网一区| 精品久久久一二三区| 怡红院日本一道日本久久| 久久免费观看视频| 久久国产高潮流白浆免费观看| 97久久精品人人做人人爽| 久久国产精品无码HDAV | 久久热这里只有精品在线观看| 丁香久久婷婷国产午夜视频| 狠狠色丁香久久综合婷婷| 久久99精品国产麻豆| 国产精品久久波多野结衣| 国内精品久久久久久99| 无码日韩人妻精品久久蜜桃| 亚洲欧美成人综合久久久| 国产精品美女久久久久久2018| 国产美女久久久| 综合久久国产九一剧情麻豆| 岛国搬运www久久| 久久久久99精品成人片牛牛影视 | 无遮挡粉嫩小泬久久久久久久 | 久久久久18| 色妞色综合久久夜夜 | 要久久爱在线免费观看| 青青草国产97免久久费观看| 久久亚洲精品成人AV| 人人狠狠综合久久亚洲高清|