C 多執行緒程式設計

2021-08-26 19:39:22 字數 4084 閱讀 9067

一、簡單的例子

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 multithreading

private void form1_load(object sender, eventargs e)

private void crossthreadflush()

}private void threadfuntion(string time)

);//呼叫**

}else

}///

/// 帶引數的啟動方法

///

/// 讓執行緒在執行過程中的休眠間隔

public void parameterrun(object ms)}}

2、控制多個控制項的方法:

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 multithreading

private void form1_load(object sender, eventargs e)

/*private void crossthreadflush()

}private void threadfuntion(string time)

);//呼叫**

}else

}/// /// 帶引數的啟動方法

///

/// 讓執行緒在執行過程中的休眠間隔

public void parameterrun(object ms)

} */

private void crossthreadflush()

private void threadfunction()}}

}

二、多執行緒程式設計的幾種方式

1不帶引數的啟動方式

using system;using system.collections.generic;

using system.text;

using system.threading;

namespace startthread

///

/// 不帶引數的啟動方法

///

public void nonparameterrun()}}

2帶引數的啟動方法

如果要在例項化執行緒時要帶一些引數,就不能用threadstart委託作為建構函式的引數來例項化thread了,而要parameterizedthreadstart委託,和threadstart一樣的是它也是執行緒啟動時要執行的方法,和threadstart不同的是,它在例項化時可以用乙個帶有乙個object引數的方法作為建構函式的引數,而例項化threadstart時所用到的方法是沒有引數的。

為什麼是object這樣的引數呢?很簡單,因為在.net中object是所有型別的基類,用它可以表示array(陣列)、inte***ce(介面)、valuetype(值型別,如bool,byte,char,short,int,float,long,double等)、class(類)等.net中的型別。當然,這也意味著如果你要啟動乙個執行緒,給它傳遞乙個int型別引數時,必須在啟動方法中進行相應的型別轉換。

using system;

using system.collections.generic;

using system.text;

using system.threading;

namespace startthread

///

/// 帶引數的啟動方法

///

/// 讓執行緒在執行過程中的休眠間隔

public void parameterrun(object ms)}}

}在這個方法裡,我們在啟動執行緒時順便指定了執行緒的暫停間隔,也就是這句:

parameterthread.start(30);

執行緒啟動時執行的方法是public void parameterrun(object ms),這個值為30的int型別變數被裝箱成object,所以在方法中還需要將它轉換成int型別,這個可以通過拆箱或者其它辦法解決。

假如我們要啟動兩個執行緒,每個執行緒的暫停間隔不一樣,啟動**如下:

using system;

using system.collections.generic;

using system.text;

using system.threading;

namespace startthread

///

/// 帶引數的啟動方法

///

/// 讓執行緒在執行過程中的休眠間隔

public void parameterrun(object ms)}}

} 對上面的**做一點說明,

就是執行緒啟動之後,執行緒的例項不必再存在

,例如在上面的**中我用的是同乙個例項例項化了兩個執行緒,並且這兩個執行緒執行很正常。

繼續探索

上面解決了乙個問題,如果在啟動執行緒時需要引數如何解決,如果針對上面的問題繼續發掘,比如:在啟動執行緒時不但要指定執行緒的暫停間隔,還需要指定迴圈次數(在上面的所有例子中都是執行10次的),這個問題該如何解決呢?

有兩種辦法可以解決:

這裡說說重新定義乙個實體類來解決的方法,**如下。

using system;

using system.collections.generic;

using system.text;

using system.threading;

namespace startthread

}///

/// 執行緒的暫停間隔

///

public int interval

}///

/// 建構函式

///

/// 執行緒的暫停間隔

/// 迴圈次數

public mythreadparameter(int interval,int loopcount)

}class program

///

/// 帶多個引數的啟動方法

///

/// 方法引數

public void myparameterrun(object ms)}}

}}如果實現上面的效果,**如下:

using system;

using system.collections.generic;

using system.text;

using system.threading;

namespace startthread

public void start()

}private void run()}}

class program}}

上面的**的執行效果和前面的**執行效果類似,只不過是將業務處理**放在乙個單獨的類mythreadparameter中,使得mythreadparameter看起來也像乙個thread,實際上維護的還是其內部的thread,在一些大型系統中這樣做的好處是便於維護。

總結:在本篇主要講述如何啟動執行緒的問題,在啟動時可能會遇到無需引數、需要多個引數的情況,在這裡講述了如何解決這些問題的思路。在.net類庫中雖然存在著龐大的類庫,但是並不是總會有合適的類來解決我們所遇到的問題,但是只要肯動腦筋總會想到合適的辦法。

C 多執行緒程式設計

一 thread 基礎 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式 方...

C 多執行緒程式設計

乙個程序通常定義為程式的乙個例項。在win32中,程序佔據4gb的位址空間。與它們在ms dos和16位windows作業系統中不同,win32程序是沒有活力的。這就是說,乙個win32程序並不執行什麼指令,它只是佔據著4gb的位址空間,此空間中有應用程式exe檔案的 和資料。exe需要的任意dll...

C 多執行緒程式設計

建立執行緒的函式 handle createthread lpsecurity attributes lpthreadattributes,使用預設安全形態,設為null,表明不可被子執行緒繼承 size t dwstacksize,初始棧大小,預設值0表示使用與呼叫該函式的執行緒相同的棧大小 lp...