C 多執行緒demo

2021-12-30 00:01:25 字數 4761 閱讀 9290

首先,我們寫個簡單的單執行緒程式,也就是只有程式自己建立的那個主線程,沒有使用多執行緒.

建立乙個新工程,向視窗新增乙個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...