• <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>

            cc

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              38 隨筆 :: 14 文章 :: 21 評(píng)論 :: 0 Trackbacks

            Windows 窗體控件僅可在創(chuàng)建它們的線程上執(zhí)行,即它們不是線程安全的。如果要從后臺(tái)線程獲取或設(shè)置控件的屬性或?qū)丶{(diào)用方法,則必須將調(diào)用封送到創(chuàng)建該控件的線程。

            在控件上有五個(gè)函數(shù)對(duì)于從任何線程調(diào)用都是安全的:InvokeRequiredInvokeBeginInvoke EndInvokeCreateGraphics。對(duì)于所有其他方法調(diào)用,應(yīng)使用上述調(diào)用方法之一。

            默認(rèn)情況下,Windows 為您封送調(diào)用。但是,如果對(duì)某控件進(jìn)行多次調(diào)用,則您自己創(chuàng)建一個(gè)執(zhí)行這些調(diào)用的方法并且進(jìn)行跨線程調(diào)用將有效得多。通過(guò)調(diào)用 Control.Invoke 方法之一進(jìn)行跨線程調(diào)用。Invoke 方法采用對(duì)委托的引用。通常,此委托是 MethodInvoker 委托的一個(gè)實(shí)例。

            InvokeRequired

            public bool InvokeRequired { get ; }

            如果調(diào)用方對(duì)此控件進(jìn)行方法調(diào)用時(shí)必須調(diào)用 Invoke,則返回真。

            BeginInvoke

            public IAsyncResult BeginInvoke(Delegate method)
            public IAsyncResult BeginInvoke(Delegate method, Object[] args)

            在擁有此控件的基礎(chǔ)窗口句柄的線程上執(zhí)行給定的委托。異步調(diào)用該委托并且該方法立即返回。可從任何線程調(diào)用此方法,甚至可以從擁有該控件的句柄的線程上調(diào)用。如果該控件的句柄尚不存在,將沿該控件的父鏈向上查找,直到找到確實(shí)有窗口句柄的控件或窗體。如果無(wú)法找到相應(yīng)的句柄,BeginInvoke 將引發(fā)異常。此委托方法中的異常被視為未捕獲的異常,將發(fā)送給應(yīng)用程序的未捕獲的異常處理程序。

            EndInvoke

            public Object EndInvoke(IAsyncResult asyncResult)

            檢索由傳遞的 IAsyncResult 接口所代表的異步操作的返回值。如果尚未完成異步操作,此函數(shù)將阻塞,直至結(jié)果可用。

             

            Invoke

            public Object Invoke(Delegate method)
            public Object Invoke(Delegate method, Object[] args)

            在擁有此控件的基礎(chǔ)窗口句柄的線程上執(zhí)行給定的委托。同步調(diào)用該委托并且此方法在調(diào)用的方法返回后立即返回。返回值是調(diào)用的方法的結(jié)果。在控件所屬的同一個(gè)線程上調(diào)用此方法是錯(cuò)誤的。


            下面的示例演示如何創(chuàng)建一個(gè)后臺(tái)線程,該線程使用 MethodInvoker 以固定時(shí)間間隔更新 ProgressBar 控件:

             1.
             2
             3 //Start the background thread
             4 timerThread = new Thread(new ThreadStart(ThreadProc));
             5 timerThread.IsBackground = true;
             6 timerThread.Start();
             7
             8 .
             9
            10 //This function is executed on a background thread - it marshalls calls to
            11 //update the UI back to the foreground thread
            12 public void ThreadProc() {
            13
            14     try {
            15         MethodInvoker mi = new MethodInvoker(this.UpdateProgress);
            16         while (true{
            17
            18             //Call BeginInvoke on the Form
            19             this.BeginInvoke(mi);
            20             Thread.Sleep(500) ;
            21         }

            22     }

            23     //Thrown when the thread is interupted by the main thread - exiting the loop
            24     catch (ThreadInterruptedException e) {
            25         //Simply exit.
            26     }

            27     catch (Exception we) {
            28     }

            29 }

            30
            31 .
            32
            33 //This function is called from the background thread
            34 private void UpdateProgress() {
            35
            36     //Reset to start if required
            37     if (progressBar1.Value == progressBar1.Maximum) {
            38         progressBar1.Value = progressBar1.Minimum ;
            39     }

            40
            41
            42     //Reset to start if required
            43     progressBar1.PerformStep() ;
            44 }

            45
            46 .
            47
            48 //Make sure we clean up the background thread in Dispose
            49 public override void Dispose() {
            50    if (timerThread != null{
            51        timerThread.Interrupt();
            52        timerThread = null;
            53    }

            54
            55    base.Dispose();
            56}

            57
            posted on 2007-12-03 14:38 醒目西西 閱讀(542) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久精品无码专区免费东京热| 乱亲女H秽乱长久久久| 中文字幕精品无码久久久久久3D日动漫 | 伊人久久亚洲综合影院| 久久久久久久人妻无码中文字幕爆 | 国产一区二区精品久久岳 | 亚洲国产精品久久久久| 亚洲午夜无码久久久久小说| 久久久婷婷五月亚洲97号色| 久久久久亚洲精品无码网址 | 久久精品国产72国产精福利| 久久亚洲AV成人出白浆无码国产| 久久久久人妻精品一区三寸蜜桃| 久久综合九色综合网站| 亚洲国产成人精品91久久久| 国产亚洲婷婷香蕉久久精品 | 久久久黄片| 久久精品夜夜夜夜夜久久| 久久久精品视频免费观看 | 久久精品麻豆日日躁夜夜躁| 久久久WWW成人| 大美女久久久久久j久久| 久久丫精品国产亚洲av不卡| 人人狠狠综合久久亚洲高清| 大蕉久久伊人中文字幕| 久久精品免费一区二区三区| 99久久国产综合精品女同图片| 久久久噜噜噜久久中文字幕色伊伊| a高清免费毛片久久| 狠狠综合久久综合88亚洲| 无码精品久久一区二区三区 | 久久精品国产亚洲AV无码娇色 | 久久精品国产亚洲AV香蕉| 色综合久久久久无码专区| 亚洲国产视频久久| 人人狠狠综合88综合久久| 久久亚洲国产成人影院网站| 日本欧美国产精品第一页久久| 久久久久亚洲av成人无码电影| 久久精品国产色蜜蜜麻豆| 免费精品久久久久久中文字幕|