由於專案中存在這樣的載入的畫面:在介面上有顯示載入資訊的
label
控制項和進度條,如果採用單執行緒則在載入資料的時候
ui介面會被鎖死,造成假死的感覺。為了給乙個更友好的介面,因此有必要引入多執行緒技術,使得軟體更加「人性化」。
但隨後在子執行緒中訪問介面上的控制項的時候會出現異常,不能操作主線程所控制的
ui介面。看來這得用到委託技術了!
首先我們定義委託:
public delegate void loadin(string data, int progress);
定義委託用
delegate
關鍵字,隨後跟著乙個返回值(這裡
void
就是沒有返回值了),
loadin
是委託名,後面帶著兩個引數,分別代表顯示載入的資料和載入進度條的數值!
在窗體的
load
事件裡面我們定義乙個子執行緒,用於在後台載入資料並顯示載入情況。
定義執行緒:
threadstart
ts = new
threadstart(downin); //
括號裡面的引數是乙個方法名,表示執行緒要處理的方法
thread mythread = new
thread(ts);
mythread.start(); //
執行緒開始運作
以上三行是執行緒操作的核心內容,不熟悉執行緒定義和執行原理等的園友請參考《
c#執行緒參考手冊》!
然後我們在
downin
方法裡面例項化委託並呼叫之。(這裡「例項化」似乎用得不妥,但其實委託和類有很多地方是相似的)
private void downin()
委託其實就是充當方法的簽名,這裡委託的引數就是乙個方法名,這個方法名帶有兩個引數,和委託參數列是一樣的,同時返回型別也是一樣!
private
void update(string data,int progress) //
在info
標籤上顯示載入資訊
就這樣我們繞了一圈,「間接」得通過委託訪問主線程構建的控制項。
本文只是拋磚引玉,可以了解一下執行緒和委託的好處。當然,執行緒並不是越多越好,否則只會增加系統開銷,應該看實際需要來應用。
注:如有疏漏之處請指教,謝謝。
C 委託與執行緒通訊
1 c 中的委託機制我簡單理解為c 中的函式指標。用法如下 使用委託 public delegate string messagedelegate string message public class m class program 委託的定義很明顯,他的返回型別和引數需要和被委託的方法一致,呼叫...
Qt中UI執行緒與子執行緒的互動
gui框架一般只允許ui執行緒操作介面元件,qt也是如此。但我們的應用程式一般是多執行緒的,勢必就涉及到ui執行緒與子執行緒的互動。下面介紹常用的ui執行緒與子執行緒互動方式,並附上自己的demo。qt中提供了一些執行緒安全的方法來讓我們使用 a.使用訊號槽 qt的訊號槽是執行緒安全的。connec...
C 窗體 UI執行緒委託
很多時候寫windows程式都需要結合多執行緒,在c 中用如下得 來建立並啟動乙個新的執行緒。thread thread new thread new threadstart threadproc 例項化乙個執行緒 thread.isbackground true 將執行緒改為後台執行緒 threa...