使用多執行緒載入多個Xml檔案到TreeView控制項

2022-03-24 19:59:45 字數 3193 閱讀 9258

原**:

loadingxmlintvmtcode.zip

在很多情況下程式設計師需要採用多執行緒來開發應用程式,使用者可以在前台運算元據或其他工作,在後台程式正在載入很大的一些檔案,而這一過程不會影響到前台的使用者。在這篇文章中,我來講述一下怎樣通過多個執行緒來載入多個檔案。

在這個例子中我們將來研究這樣一件事情,讀取多個

xml檔案並通過

treeview

把它們顯示出來。我們可以通過資料庫來完成,不過為了保持例子的簡單這裡採用了

xml檔案。

你會注意到我們有兩個

xml檔案同原**放在一起。

程式使用者介面如下:

filedisplayer

類用來顯示上面的窗體。窗體的包括一些按紐:瀏覽按紐,執行按紐,終止按紐以及退出按紐。應用程式可以通過點選退出按紐來結束整個程式的執行。當點選瀏覽的時候會開啟乙個檔案選擇對話方塊來載入xml檔案。當然你也可以直接在文字框中輸入檔案全路徑。

private void selectbutton_click(object sender, system.eventargs e)}}

一旦選擇了乙個檔案,使用者可以通過點選執行來讀取檔案資料。顯示的結果就如上面treeview中所看到的。這篇文章的主要目的就是給讀者乙個方法來執行多執行緒。終止按紐用來退出執行的任務。

現在我們已經習慣的各種使用者介面控制項,那就讓我們來研究其他部分。你可以在**中注意到我們已經編寫了下面一些**(如下):

private thread queuemonitorthread ;//定義乙個執行緒,用來監視佇列

private requestqueue req_queue;//放了載入的檔案資訊(檔名)

private bool m_babort;//通過這標誌來控制 queuemonitorthread

private threadeventdelegate ontreeviewelement;//非同步**呼叫,切換執行緒來更新treeview

在requestqueue.cs檔案中我們定義了乙個requestqueue類,他是乙個佇列用來儲存檔名資料。在這個例子中設定了佇列的容量為5。因此佇列最多能放五個檔名在裡面。在add方法中有乙個邏輯,如果新增檔案成功返回1,如果失敗(隊列為滿)返回0;remove方法用來移動佇列頭索引,如果頭索引等與尾索引那佇列就為空了;getfile方法是用來獲取佇列最前面的項。如果為空返回0, setsize方法用來重新設定佇列的容量,如果呼叫原來的資料就會被扔掉(這裡作者是用陣列來模擬環形佇列,設定容量會重新例項化乙個陣列);isempty方法用來判斷佇列是否有空。

備註:你也可以使用system.collections命名空間下的queue類。

當點選了執行按紐後,程式會從獲取路徑文字框中獲取檔名並把它加入到fileinfo結構(很奇怪這裡作者的結構只是存了乙個string)。最後把這個結構加入到了佇列。queuemonitorthread執行緒會半秒鐘去掃瞄一次佇列。

private void processbutton_click(object sender, system.eventargs e)

req_queue.add(f);

}下面是繼承窗體的建構函式。

public filedisplayer()

下面是執行緒的執行方法。

public void queuemonitorfunc()

object o = req_queue.getfile();//從佇列獲取檔案

if( (o  is fileinfo ))//佇列是否為空

thread.sleep(500);}}

請注意上面的queuemonitorthread執行緒,他自己不處理檔案。只是檢測佇列,如果有檔案存在就呼叫parse方法,而parse方法為每個檔案處理生成乙個執行緒。

方法內容如下:

private void parse(fileinfo info)

下面是建立執行緒的類:

public class parserthread

}//建立返回執行緒。

public static thread createthread (start s, object arg1)

}下面是parsermethod方法:

public  void parsermethod(object obj)

如果你看了parserthread類的createthread方法,那上面的parsermethod方法就很清楚了。我們成功的完成了引數的傳遞。下面是process_xml方法:

public  void process_xml(string name)

for( int j =0;j

if( child_element.name == "emp_name" )

if( child_element.name == "emp_address" )

if( child_element.name == "emp_city" )

if( child_element.name == "emp_state" )

if( child_element.name == "emp_pin" )

if( child_element.name == "emp_country" )

else if( child_element.name == "emp_email" ) }

//切換執行緒到treeview所被建立的執行緒,從而更新treeview,不過這裡是非同步的。

begininvoke(ontreeviewelement, new object );}}

}catch(exception exp)

}empdetails類實現了iempdetails介面,用來包含資料,略。

begininvoke方法非同步執行,裡面通過**ontreeviewelement來呼叫populatetreeview方法:

private void populatetreeview(object sender, threadeventargs e)

另外乙個就是引數類,用來傳輸xml檔案的內容:

public class threadeventargs : eventargs

}public threadeventargs(iempdetails empdetails)

}結論:這個例子裡面的設計對於顯示大量的檔案是很有用的。這裡又乙個限制就是一旦點選了終止按紐,監視執行緒就會終止。要使能夠再次使用需要重其應用程式。

希望這篇文章裡面的一些思想對你會有所幫助(帶引數呼叫執行緒和建立多執行緒任務)。

testNG 多執行緒測試 xml檔案實現

測試用例一般是單執行緒模式,為了提高測試效率。testng的多執行緒可以分為test,class,method級別的併發,可以通過在testng.xml中的suite tag下設定。methods級別 所有用例都可以在不同的執行緒去執行。classs級別 不同class tag下的用例可以在不同的執...

原創 Android多個xml檔案的使用

android中經常會使用多個xml檔案,但在mainactivity中使用的setcontentview r.layout.main 只載入main.xml檔案,其他xml檔案不載入進當前檢視,當我們要用到其他xml檔案中的控制項是發現直接使用findviewbyid 方法時不報錯但控制項的值找不...

Struts中使用多個xml配置檔案

在實際專案中使用struts,因為以前對struts看的比較多。儘管實際中沒開發過大的專案,當自己寫一些測試頁面什麼的還是做過的,所有熟悉的也比較快,就那麼幾個簡單的類,複雜的也不去研究。懶的去研究那些。不過聽說他的裡面有乙個struts可以分模組配置多個xml檔案。感覺不錯。主要是這樣可以分模組來...