C 中跨執行緒操作控制項

2021-05-24 05:50:45 字數 2015 閱讀 2189

本文將分別對上述兩種情況的跨執行緒操作控制項方法進行闡述。

backgroundworker

是個很好的夥計,因為它可以忙你搞定許多髒活累活。具體的講,它可以自動的幫你建立工作執行緒,可以在工作時把工作的進展情況告訴給你,可以在工作完成時通知並幫你做一些收尾的工作,當你覺得他很煩的時候,你還可以隨時讓他停下來。

backgroundworker

元件提供了三個事件:dowork ,progresschanged 和runworkercompleted 。dowork 顧名思義是用來處理工作業務的,在這裡面加入你想讓工作執行緒在後台處理的**即可。但是在這個事件中不能加入跨執行緒操作的**。如下圖,當我試圖改變label.text 的值時,丟擲了異常資訊:

不過這裡有個例外,就是對於toolstrip 及其從該類繼承過來的容器控制項,某些在該容器上的控制項(如statuslabel )可以在工作執行緒中直接操作。至於為啥,我沒有去深究,不過根據圖中的提示資訊,乙個很合理的解釋就是這類控制項和backgroundworker 由同乙個執行緒建立。

progresschanged

和runworkercompleted 事件分別用來報告工作執行緒的工作情況和在工作執行緒結束後進行一些操作。這兩個事件都支援跨執行緒操作控制項。下面通過乙個簡單的例項進行驗證。

用程式實現將乙個目錄中的檔案拷貝至另外乙個目錄。 1

.程式介面設計如下:

2.工作流程:(1 )設定源目錄和目標目錄(2 )拷貝檔案,在listview 中顯示拷貝資訊,更新狀態列中的進度條和當前處理檔案資訊(3 )拷貝過程結束後,用messagebox 提示拷貝檔案數量,同時清空源目錄和目標目錄資訊。 3

.**實現

4.執行結果

在一些情況下,thread/threadstart 也是有一定市場的,特別在工作執行緒很多的情況下,顯得尤為突出。事實上,在這種環境下要實現上述的例子並不難,**也沒有增加多少,前提是你必須理解control.invoke方法。

該方法在msdn 上的解釋是:在擁有此控制項的基礎視窗控制代碼的執行緒上執行委託。如果你注意到了第一張顯示的異常資訊,你會很快理解這個方法的重大意義。它可以讓工作執行緒的中委託在主線程中執行!因此實現上述例子的思路就是,在工作執行緒中使用委託來執行操作控制項的方法,然後用主視窗的invoke 方法呼叫!

為了實現backgroundworker 的

progresschanged

和runworkercompleted

事件,定義了reportprocessinfo 委託和doneaftercompleted 委託。

主要**如下:

執行結果如下:

**中的invokerequired 用於判斷該段**是否是在其他執行緒中委託呼叫的,如果為真,就需要在本執行緒中重新建立乙個該委託的例項,並用invoke 方法呼叫它,讓這段**在本執行緒中呼叫。

當**中需要對多個控制項進行操作,最好使用form 的invokerequired 來判斷,並使用form 的invoke 方法呼叫新建的委託例項。當只對某個控制項操作時,就可以只用該控制項的invokerequired 和invoke 。比如tbsource, 就可用

tbsource.invokerequired

和tbsource.invoke 。

下面是本文相關**

thread_threadstart方式

backgroundworker方式

C 跨執行緒操作控制項

在看別人 的時候總是會invoke和begininvoke方法,雖然大致明白是什麼意思,但卻不能很好的使用,上網查了很多資料,剛巧看到自己求學期間 過一篇博文 c invoke和begininvoke的區別 net平台下winform wpf禁止跨執行緒直接訪問控制項,因此在必須跨執行緒訪問控制項的...

C 實現跨執行緒操作控制項方法

由於在.net平台下winform wpf禁止跨執行緒直接訪問控制項,因此在必須跨執行緒訪問控制項的時候採用非同步方式。1 winform專案中跨執行緒訪問控制項 編寫乙個winform小例項 在做winform專案中,有時為了將系統執行的狀態實時顯示到form中,因此新增乙個richtextbox...

WPF 跨執行緒操作控制項

跨執行緒操作ui net2.0以來,就規定了不允許子執行緒對ui上建立的物件進行操作.在winform中,通過控制項的委託方法 control.invoke control.begininvoke 進行呼叫.而在wpf中對控制項增加了dispathcer類.dispatcher 該類的常用方法為 c...