C 多執行緒委託方式讓主介面顯示傳值內容

2021-06-11 01:30:05 字數 1754 閱讀 2965

c# delegate(委託)與多執行緒

很多時候寫windows程式都需要結合多執行緒,在.net中用如下得**來建立並啟動乙個新的執行緒。

public void threadproc();

thread thread = new thread( new threadstart( threadproc ) );

thread.isbackground = true;

thread.start();

但是很多時候,在新的執行緒中,我們需要與ui進行互動,在.net中不允許我們直接這樣做。可以參考msdn中的描述:

「windows 窗體」使用單執行緒單元 (sta) 模型,因為「windows 窗體」基於本機 win32 視窗,而 win32 視窗從本質上而言是單元執行緒。sta 模型意味著可以在任何執行緒上建立視窗,但視窗一旦建立後

就不能切換執行緒,並且對它的所有函式呼叫都必須在其建立執行緒上發生。除了 windows 窗體之外,.net framework中的類使用自由執行緒模型。

sta 模型要求需從控制項的非建立執行緒呼叫的控制項上的任何方法必須被封送到(在其上執行)該控制項的建立執行緒。基類 control 為此目的提供了若干方法(invoke、begininvoke 和 endinvoke)。invoke

,不需要而外宣告。例如:methodinvoker和eventhandler,這兩種型別委託的函式外觀是固定的,methodinvoker是void function()型別的委託,而eventhandler是void function(object, eventargs)

型別的委託,第乙個不支援引數,第二中的引數型別和數量都是固定的,這兩種委託可以很方便的呼叫,但是缺乏靈活性。請注意begininvoke前面的物件是this,也就是主線程。現在再介紹

時候,ui當然會停止響應。

與以前vc中建立乙個新的執行緒需要呼叫afxbeginthread函式,該函式中第乙個引數就是執行緒函式的位址,而第二個引數是乙個型別為lpvoid的指標型別,這個引數將傳遞給執行緒函式。現在我們沒有辦法

再使用這種方法來傳遞引數了。我們需要將傳遞給執行緒的引數和執行緒函式包裝成乙個單獨的類,然後在這個類的建構函式中初始化該執行緒所需的引數,然後再將該例項的執行緒函式傳遞給thread類的構造

函式。**大致如下:

public class procclass

public void threadproc()

}procclass threadproc = new procclass("use thread class");

thread thread = new thread( new threadstart( threadproc.threadproc ) );

thread.isbackground = true;

thread.start();

就是這樣,需要建立乙個中間類來傳遞執行緒所需的引數。

那麼如果我的執行緒又需要引數,又需要和ui進行互動的時候該怎麼辦呢?可以修改一下**:

public class procclass

public void threadproc()

}procclass threadproc = new procclass("use thread class", new outdelegate(outtext));

thread thread = new thread( new threadstart( threadproc.threadproc ) );

thread.isbackground = true;

thread.start();

C 多執行緒使用委託修改介面UI

多執行緒修改介面時,需要考慮到一般多執行緒讀髒資料,資料重寫等問題,所以一般把多線成修改介面的方法交由ui執行緒本身執行,這樣就使多執行緒修改ui變成單執行緒修改了,問題得到簡化 多執行緒如何將修改介面的方法交給ui執行緒呢,就是用c 的委託了 我一般的做法如下 delegate void upda...

c 委託與多執行緒

很多時候寫windows程式都需要結合多執行緒,在.net中用如下得 來建立並啟動乙個新的執行緒。public void threadproc thread thread new thread new threadstart threadproc thread.isbackground true t...

C 多執行緒 與 委託

簡單的多執行緒 protected void page load object sender,eventargs e private void mymethod object o 使用委託的多執行緒 public partial class demo form 定義委託 delegate void ...