幾個程序在大多數情況下要包含很多的子執行緒,那麼他們之間免不了的要互相傳遞很多的引數,那麼引數怎麼傳遞的呢?
第一種方法:thraed類有乙個帶引數的委託型別的過載形式,這個委託的定義如下:
delegate
void parameterizedthreadstart(object obj)
這個thread類的構造方法的定義如下:
下面的**使用了這個帶引數的委託向執行緒傳遞乙個字串引數:
static
void mystaticparamthreadmethod(object obj)
staticvoid main(string args)
注意這種形式,委託就是thread要執行的方法,這個委託有乙個類的例項物件作為引數。然後在thread的start()方法中把這個物件傳進去。
如果使用了不帶引數的委託,當然也能很正常的啟動執行緒,別學傻了。
第二種方法:定義乙個類來傳遞引數
classprogram
}//class
//定義乙個類傳遞引數
public
class
mydata
public
void
threadmethod()
}//class
這種方法的特點是:子執行緒的執行入口是在另乙個類中,這樣正好可以借助這個類的成員函式,給子執行緒傳參。
第三種方法:定義乙個新的執行緒類,讓所有的子執行緒類都繼承自這個類
class mythread
}
}
}//class
其實上面的兩種方法的原理是一樣的,這是乙個面向資料,乙個面向執行緒。
這裡看到是傳遞引數,也就是說子執行緒要呼叫主線程的乙個方法,然後把引數傳遞給主線程的那個方法。說一下方法是前面已經講過的invoke和begininvoke,但是那時呼叫主線程的方法並沒有傳遞引數,今天看一下帶引數的呼叫主線程的指定方法。
usingsystem;
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讓子執行緒給主線程呼叫主線程的函式完成任務的時候,給一些引數。
這裡就直接在同乙個類中展示一下:
usingsystem;
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...