C 參考 主線程和子執行緒之間的引數傳遞

2022-04-10 14:49:51 字數 3235 閱讀 7342

幾個程序在大多數情況下要包含很多的子執行緒,那麼他們之間免不了的要互相傳遞很多的引數,那麼引數怎麼傳遞的呢?

第一種方法:thraed類有乙個帶引數的委託型別的過載形式,這個委託的定義如下:

delegate

void parameterizedthreadstart(object obj)

這個thread類的構造方法的定義如下:

下面的**使用了這個帶引數的委託向執行緒傳遞乙個字串引數:

static

void mystaticparamthreadmethod(object obj)

static

void main(string args)

注意這種形式,委託就是thread要執行的方法,這個委託有乙個類的例項物件作為引數。然後在thread的start()方法中把這個物件傳進去。

如果使用了不帶引數的委託,當然也能很正常的啟動執行緒,別學傻了。

第二種方法:定義乙個類來傳遞引數

class

program

}//class

//定義乙個類傳遞引數

public

class

mydata

public

void

threadmethod()

}//class

這種方法的特點是:子執行緒的執行入口是在另乙個類中,這樣正好可以借助這個類的成員函式,給子執行緒傳參。

第三種方法:定義乙個新的執行緒類,讓所有的子執行緒類都繼承自這個類

class mythread

}
}

}//class

其實上面的兩種方法的原理是一樣的,這是乙個面向資料,乙個面向執行緒。

這裡看到是傳遞引數,也就是說子執行緒要呼叫主線程的乙個方法,然後把引數傳遞給主線程的那個方法。說一下方法是前面已經講過的invoke和begininvoke,但是那時呼叫主線程的方法並沒有傳遞引數,今天看一下帶引數的呼叫主線程的指定方法。

using

system;

using

system.collections.generic;

using

system.componentmodel;

using

system.data;

using

system.drawing;

using

system.linq;

using

system.text;

using

system.windows.forms;

using

system.threading;

namespace

private

void btnstart_click(object

sender, eventargs e)

private

void

threadmethod()

else

//子執行緒還是可以訪問ui執行緒的普通變數的,只是不能訪問控制項

//因為普通變數是屬於整個類的,屬於整個程序的,各個執行緒時共享的

//對訪問共享的資料,加乙個lock的鎖更加的好

count++;

thread.sleep(

1000

); }

}private

void

doworkuithread()

}}

上面的這種情況似乎用不著子執行緒給ui執行緒返回資料,反正子執行緒可以訪問主線程的成員變數。但是另一種情況來了,當子執行緒不再ui執行緒所在的類的時候,也就是說子執行緒在乙個工具類中,ui類new出來乙個工具類完成一定的工作,ui類可以初始化工具類,但是工具類完成了一定任務後怎麼通知ui類呢?現在有這種假設:

ui類要socket連線網路,現在有乙個socketutil工具可以完成這項任務,所以ui類就new出來乙個socketutil,然後呼叫指定的函式,把ip和port傳遞進去。在完成了一些任務以後,socketutil要反饋一些資訊給ui類。讓ui類顯示反饋的資訊。現在面臨兩個問題:

1. ui類怎麼知道socketutil完成了這項任務,然後取顯示資料呢?

2. ui類即使知道了什麼時候顯示資訊,那麼要顯示的內容,ui類怎麼知道是什麼呢?

第乙個問題的解決方法就是事件,利用事件就能在socketutil完成一些任務之後,通知ui類接下來怎麼做。

第二個問題就是利用invoke讓子執行緒給主線程呼叫主線程的函式完成任務的時候,給一些引數。

這裡就直接在同乙個類中展示一下:

using

system;

using

system.collections.generic;

using

system.componentmodel;

using

system.data;

using

system.drawing;

using

system.linq;

using

system.text;

using

system.windows.forms;

using

system.threading;

namespace

private

void btnstart_click(object

sender, eventargs e)

private

void

threadmethod()

else

//子執行緒還是可以訪問ui執行緒的普通變數的,只是不能訪問控制項

//因為普通變數是屬於整個類的,屬於整個程序的,各個執行緒時共享的

//對訪問共享的資料,加乙個lock的鎖更加的好

count++;

thread.sleep(

1000

); }

}private

void doworkuithread(string name, int

id)

}}

這個方法是這樣操作的,begininvoke可以傳遞乙個陣列,這個陣列是boject型別的,這樣就可以把所有的引數都裝箱成object型別的,弄成乙個object型別的陣列,然後到呼叫方在拆封就可以了。

c 子執行緒與主線程之間的通訊

先說明一下,本人最近遇到了什麼問題,就是在寫寫訊息佇列的時候,發現訊息佇列每次接收乙個訊息的時候都是建立了乙個新的執行緒。這樣就導致了訊息處理的時候沒有在主線程上進行,然而其中的一些步事項是要通過主線程才能操作的。這樣就引出了乙個子執行緒怎麼去通知主線程要做哪些事情呢?為了解決上面的問題我找了好的多...

C 子執行緒與主線程之間的通訊

先說明一下,本人最近遇到了什麼問題,就是在寫寫訊息佇列的時候,發現訊息佇列每次接收乙個訊息的時候都是建立了乙個新的執行緒。這樣就導致了訊息處理的時候沒有在主線程上進行,然而其中的一些步事項是要通過主線程才能操作的。這樣就引出了乙個子執行緒怎麼去通知主線程要做哪些事情呢?為了解決上面的問題我找了好的多...

內部通訊 主線程和子執行緒之間的通訊

1.主線程建立handler類的物件,重寫handlemessage方法 handler handler new handler public void handlemessage message msg switch msg.what case 0 break 2.主線程建立乙個子執行緒 用thr...