1. 程式人生 > >跨線程訪問控件的問題和編程方法

跨線程訪問控件的問題和編程方法

類型 class 一個 執行 new 方法 思路 函數的參數 gpo



很多時候寫windows程序都需要結合多線程,經常會跨線程操作控件,這時就會出錯,提示不允許"從不是創建控件的進程訪問它"。

這個時候的解決思路:把想對另一線程中的控件實施的操作放到一個函數中,然後使用delegate代理那個函數,並且在那個函數中加入一個判斷,用InvokeRequired來判斷調用這個函數的線程是否和控件線程在同一線程中,如果是則直接執行對控件的操作,否則利用控件的Invoke或BeginInvoke方法來執行這個代理,執行喚醒控件的操作。
Invoke的中文解釋是喚醒,它有兩種參數類型 (Delegate, Object[])和(Delegate)
Delegate就是前面提到的那個代理,而Object[]則是用來存放Delegate所代理函數的參數


delegate void aa();//定義代理

private void CtlInvoke()
{
if (label1.InvokeRequired)//判斷是否需要喚醒操作(當前線程與控件是否屬於一個線程,否就執行喚醒,是就執行方法)
{
aa a1 = new aa(label1);//執行代理
label1.Invoke(a1);//執行喚醒操作
}
else
{
return;
}
}

跨線程訪問控件的問題和編程方法