原**:
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檔案。感覺不錯。主要是這樣可以分模組來...