C 2005 多執行緒中呼叫窗體控制項

2021-04-15 15:08:25 字數 1745 閱讀 8967

第一種方法:

這種方法我沒用過,因為大家推薦不要使用,所以我沒去實驗過,具體方法如下(摘自網上):

設定system.windows.forms.control.checkforillegalcrossthreadcalls  =  false;(winform.下)如果在你的程式初始化的時候設定了這個屬性,而且在你的控制項中使用的都是微軟framework類庫中的控制項的話,系統就不會再丟擲你上面所說的這個錯誤了。當然這只是為了將vs2003的**轉換到vs2005下所使用的一種常見的方法。不建議採用;

第二種方法,也是我今天主要要講的就是利用delegate和invoke這個方法:

思路:把想對另一線程中的控制項實施的操作放到乙個函式中,然後使用delegate**那個函式,並且在那個函式中加入乙個判斷,用invokerequired來判斷呼叫這個函式的執行緒是否和控制項執行緒在同一執行緒中,如果是則直接執行對控制項的操作,否則利用控制項的invoke或begininvoke方法來執行這個**。

在繼續講解下去之前我們先來看一下這裡提到的幾個方法(如果對以下兩個東東已經了解了就可以跳過)

首先是invoke

invoke的中文解釋是喚醒,它有兩種引數型別我們這裡只講一種即(delegate, object)

delegate就是前面提到的那個**,而object則是用來存放delegate所**函式的引數

msdn上關於invoke方法有如下說明:在擁有控制項的基礎視窗控制代碼的執行緒上,用指定的引數列表執行指定委託。

用通俗的話講就是利用控制項的invoke方法,使該控制項所在的執行緒執行這個**,也就是執行我們想對控制項進行的操作,相當於喚醒了這個操作;

其次是控制項的invokerequired這個屬性(個人翻譯為』喚醒請求』):

msdn上關於它的解釋是獲取乙個值,該值指示呼叫方在對控制項進行方法呼叫時是否必須呼叫invoke方法,因為呼叫方位於建立控制項所在的執行緒以外的執行緒中。

有通俗的話講就是返回乙個值,如果與控制項屬於同乙個執行緒,則不需要進行喚醒的請求,也就是返回值為false,否則則需要進行喚醒的請求,返回為true

總感覺msdn上的翻譯讓人無法一看就明白,可能是自己智力不夠吧~~

最後就是我們的具體程式了:

delegate void aa(string  s);//建立乙個**

private void  pri(string t)//這個就是我們的函式,我們把要對控制項進行的操作放在這裡

if  (!richtextbox1.invokerequired)//判斷是否需要進行喚醒的請求,如果控制項與主線程在乙個執行緒內,可以寫成if(!invokerequired)

messagebox.show("同一執行緒內");

richtextbox1.text =t;

else

messagebox.show("不是同乙個執行緒");

aa a1 =new aa(pri);

invoke(a1,new object );//執行喚醒操作

private void  form1_load(object sender, system.eventargse)

thread  newthread = new thread(new threadstart(ttread));

newthread.start();

void  ttread()

pri("sdfs");

執行結果先調出乙個提示框顯示「不是同乙個執行緒」,然後跳出提示框顯示「同一執行緒內」,然後richtextbox1中的text值為sdfs;這樣便完成了對其它執行緒中的控制項進行操作。

C 跨執行緒呼叫窗體控制項

前段時間遇到跨執行緒呼叫窗體控制項的問題,其實一句話system.windows.forms.control.checkforillegalcrossthreadcalls false 就可以解決,但感覺會有不穩定因素,因此在網上找了一些相應的文章感覺還不錯,第一種用的比較順手 注 在devexpr...

C 關於多執行緒之執行緒中窗體之間的控制項值呼叫

本週做了乙個執行緒中開啟多個窗體的東西,父窗體開啟子窗體,父窗體獲取子窗體的控制項值,此處我在開啟窗體時,分別在不同的執行緒中開啟的,不做多考慮,上手就做,到後來程式崩掉了,原因是什麼了,找不到對應的控制項,這是為什麼了,因為建立子窗體的過程和建立父窗體的過程並不在同一執行緒中,程式無法獲知你要找的...

C 多執行緒窗體控制項安全訪問

c 2.0 為了執行緒安全,不充許子執行緒直接訪問窗體中的控制項 如果在子執行緒中直接訪問說窗體控制項,編譯器會提示,控制項不是 由該執行緒建立的.那麼在子執行緒中如何訪問窗體中的控制項呢?在窗體的建構函式中加入這一句 control.checkforillegalcrossthreadcalls ...