C 多執行緒函式如何傳引數和返回值

2021-10-05 14:37:04 字數 1757 閱讀 4876

詳見例子 bvbus.com

c#多執行緒函式如何傳引數和返回值

提起多執行緒,不得不提起 委託(delegates)這個概念.

我理解的委託就是 具有 同樣引數和返回值 的函式的集合.

比如public delegate void mydelegate(int arg);

就是這種形式的函式 void myfuntion(int i); 的集合.

如何將乙個函式加入 委託 的集合?

mydelegate dele = new mydelegate(myfuntion1);

再增加乙個

dele += new mydelegate(myfuntion2);

...委託函式 dele 就是 具有整數引數和空返回值的函式 myfuntion1,2的集合.

呼叫這個委託函式

dele(1);

就是逐個呼叫 myfuntion1,2,...

一般執行緒函式的宣告和啟動

thread t = new thread(new threadstart(myfunction));

t.start();

正是呼叫了沒有引數和返回值的 委託函式 threadstart

其中的引數myfunction 是 這個委託函式中的一員.

很明顯 這樣無法傳引數和返回值,那我們該怎麼辦?

答案就在委託 的begininvoke() 方法上, begininvoke() 也是(非同步)啟動乙個新執行緒. 例如

mydelegate dele = new mydelegate (myfunction);

dele.begininvoke(10,"abcd");

void myfunction(int count, string str);

可以實現引數的傳遞.

如何收集執行緒函式 的 返回值?

與 begininvoke 對應 有個 endinvoke 方法,而且執行完畢返回 iasyncresult 型別的返回值.

這樣我們可以這樣收集 執行緒函式的 返回值

mydelegate dele = new mydelegate (myfunction);

iasyncresult ref = dele.begininvoke(10,"abcd");

...int result = dele.endinvoke(ref); <----收集 返回值

int myfunction(int count, string str); <----帶引數和返回值的 執行緒函式

一般來說,直接在子執行緒中對窗體上的控制項操作是會出現異常,這是由於子執行緒和執行窗體的執行緒是不同的空間,因此想要在子執行緒來操作窗體上的控制項,是不可能簡單的通過控制項物件名來操作,但不是說不能進行操作,微軟提供了invoke的方法,其作用就是讓子執行緒告訴窗體執行緒來完成相應的控制項操作。 現在用乙個用執行緒控制的程序條來說明,大致的步驟如下:

1. 建立invoke函式,大致如下: /// /// delegate function to be invoked by main thread ///

private void invokefun()

2. 子執行緒入口函式: /// /// thread function inte***ce ///

private void threadfun()

}3. 建立子執行緒:

thread thdprocess = new thread( new threadstart( threadfun ) );

thdprocess.start();

C 多執行緒函式如何傳引數和返回值

提起多執行緒,不得不提起 委託 delegates 這個概念 我理解的委託就是 具有 同樣引數和返回值 的函式的集合 比如public delegate void mydelegate int arg 就是這種形式的函式 void myfuntion int i 的集合.如何將乙個函式加入 委託 的...

c 多執行緒如何從執行緒返回值

public delegate void resultcallback int i public class a 被呼叫函式所在的類 public a resultcallback callback this.result callback private resultcallback result...

C 函式引數和返回值

在呼叫函式時,大多數情況下,函式是帶引數的。主調函式和被呼叫函式之間有資料傳遞關係。前面已提到 在定義函式時函式名後面括號中的變數名稱為形式引數 formal parameter,簡稱形參 在主調函式中呼叫乙個函式時,函式名後面括號中的引數 可以是乙個表示式 稱為實際引數 actual parame...