首先,我們寫個簡單的單執行緒程式,也就是只有程式自己建立的那個主線程,沒有使用多執行緒.
建立乙個新工程,向視窗新增乙個label命名為label1;我們要讓程式執行時label1就顯示乙個數字,假設為100;通常我們會直接在視窗載入事件中寫label1.text = 「100″;這樣,執行
,label1果然顯示了100;
**如下:(例1)
using system;
using system.windows.forms;
namespace threadtest
private void form1_load(object sender, eventargs e)}}
很簡單吧,看懂了嗎??
什麼,沒有,啊~~~神啊~~~救救我吧,那請你在翻書,把最最最最最基礎的書翻出來看看裡面的最最最最最簡單例子(以後不要說我認識你)
好了,看懂的朋友繼續往下看:
我們現在要將程式稍稍改動一下,新增乙個button,命名為button1,我們要在按下button1後,將lable1的text從0顯示到100,
那麼,我們需要新增button1的click事件,在click事件內寫入迴圈顯示0到100.
**如下:(例2)
using system;
using system.windows.forms;
namespace threadtest
private void form1_load(object sender, eventargs e)
private void button1_click(object sender, eventargs e)}}
} 執行一下看看,按一下button1,結果是我們一下就看到了100,並沒有看到0~100的過程,為什麼呢?
呵呵,因為你的處理器速度太快了,就只能看到最後的結果,那麼,怎樣才能看到中間過程呢?(等一下再講)
我們先用函式的方式來實現上面的功能
寫個名為run的函式吧:
private void run()
}這樣就可以直接呼叫run函式實現功能了,而不用在事件函式內寫**。(這樣做是有好處的)
整個**如下:(例3)
using system;
using system.windows.forms;
namespace threadtest
private void form1_load(object sender, eventargs e)
private void button1_click(object sender, eventargs e)
private void run()}}
} 這裡就需要在迴圈過程中加延時了,假定我們每隔1s的延時,lable1的值增加1。
方法有很多,我們就用乙個timer來實現延時。
新增乙個timer, 命名為timer1,在timer1的tick事件內新增語句,改變label1的值。(tick事件是每經過指定時間間隔後被觸發)
**如下:(例4)
using system;
using system.windows.forms;
namespace threadtest
private void form1_load(object sender, eventargs e)
private void button1_click(object sender, eventargs e)
private void run()
private void timer1_tick(object sender, eventargs e) //timer1的tick事件
label1.text = i.tostring();}}
} 同樣的,我們執行一下,看看結果,很好,我們能夠看到0~100迴圈的過程了。
下面我們就要進入多執行緒了,不知道各位將上面的內容看懂了沒有?
開始進入多執行緒之前我還是先簡單的說說定義執行緒吧。(與多執行緒有關的其它內容我就不說了吧,那個太多太多了)
由於要使用多執行緒,我們需要引用system.threading;所以之後的**都會在前面加上using system.threading;
怎麼定義執行緒呢?通過下面的語句就定義乙個名為thread1的執行緒
private thread thread1;
和定義函式極為相似
定義執行緒之後,就要進行例項化:
thread1 = new thread(new threadstart(run));
這個語句的意思就是例項化thread1並將run函式設定為thread1的入口函式(大概意思就是,讓run函式**程thread1上執行,我是這樣理解的)
建立執行緒就算完成了,那麼怎麼執行執行緒呢?
其實和啟動timer1是類似的,thread1.start();就執行了我們建立的執行緒thread1。
好了,大功告成!哈哈,別著急,既然我們建立了執行緒,那麼在關閉視窗的時候,就要撤消執行緒。
新增formclosing事件,在事件內部寫如撤消執行緒的**:
private void form1_formclosing(object sender, formclosingeventargs e)}
這樣才算大功告成嘛,整理的**如下:(例5)(在例3的基礎上加以改動)
using system;
using system.threading;
using system.windows.forms;
namespace threadtest
private void form1_load(object sender, eventargs e)
private void button1_click(object sender, eventargs e)
private void run()}
private void form1_formclosing(object sender, formclosingeventargs e)}}
} 執行看看,按button1,出錯了,怎麼回事呢????
哈哈~~看看出錯原因,是在run函式內的label1.text = i.tostring();語句上出的錯,沒錯啊,語法正確啊
哈哈~~我來解釋一下,出錯的原因是為了保護資料的安全所以不能跨執行緒呼叫控制項,而label1.text = i.tostring();句則是**程thread1上面呼叫主線程的控制項,肯定會出錯的 !!
怎麼辦呢?用委託啊(有關委託,請參考其它資料,我就不多說了)
我的理解就是,執行緒thread1不能呼叫主線程的lable1,所以,就委託主線程來改變lable1的值。
首先看乙個例子:(從例3改寫)(並不建立執行緒,僅有主線程)
建立乙個函式,用來設定lable1的值;
private void set_labletext(string s)
當需要改變lable1的值時,就呼叫它,並傳遞要改變的值。
整理**如下:(例6)
using system;
using system.windows.forms;
namespace threadtest
private void form1_load(object sender, eventargs e)
private void button1_click(object sender, eventargs e)
private void run()}
private void set_labletext(string s)}}
實現的功能與例3是一樣的,只是,增加了乙個函式。
現在再來看看委託,我們就需要委託主線程呼叫函式set_labletext(string s);來改變lable1的值。
首先宣告乙個委託:
delegate void set_text(string s);
建立乙個全域性委託變數:(應該是變數吧)
set_text set_text; //請注意大小寫,set_text是委託型別,set_text是建立的委託(當然,這裡的命名是隨意的)
類似於建立執行緒,需要進行例項化:
set_text = new set_text(set_labletext); //括號內的set_labletext是委託要呼叫的函式(也就是例6寫的set_labletext(string s);函式)
現在,就剩下呼叫委託了,怎麼呼叫委託呢?很簡單。
同過invoke來呼叫,語句如下:
label1.invoke(set_text, new object );
//set_text是呼叫的委託,object則是我們要傳遞的引數
整理**如下:(例7)
using system;
using system.threading;
using system.windows.forms;
namespace threadtest
private void form1_load(object sender, eventargs e)
private void button1_click(object sender, eventargs e)
private void set_labletext(string s) //主線程呼叫的函式
private void run()
); //通過呼叫委託,來改變lable1的值
thread.sleep(1000); //執行緒休眠時間,單位是ms}}
private void form1_formclosing(object sender, formclosingeventargs e)}}
} 這樣,乙個簡單的多執行緒程式就算完成了。
多執行緒實現demo
多執行緒應用場景 報表匯出,大批量資料同步等等吧。同步100萬條資料,單個執行緒假如需要2.5個小時,如果5個執行緒一起跑可能只需要0.5小時,10個執行緒一起跑可能只需要十五分鐘。這樣就大大提高了效率。那麼我們如果讓多個執行緒同時跑,而且又跑的是不重複的資料呢,可以按照id 時間段進行分割。每乙個...
多執行緒執行demo
業務場景 需要大批量處理資料,執行時間容易超時。主線程等待子執行緒執行完成再執行 static int count 0 public static void main string args list list new arraylist list.add 2 list.add 1 list.add...
linux下c 多執行緒測試程式Demo
一 編寫 如下,取名為hello.c或者hello.cpp均可 include include using namespace std void show int i cout g c g hello.c c指conplier,p指debug模式 此步之後將生成hello.o程式 g hello.o...