在連續看了MSDN雜志中的一些文章后,感覺有點膩了,於是轉到C++上,換一下腦子,找找新鮮感。或許對於一個程序員來說,興趣廣泛並不是一個優點,有可能這也是為什么自己一直徘徊在所謂的程序員第一階段而無法進階的原因吧。現在尚能安慰自己的僅剩下還年輕了,再過兩三年,這個理由也將不復存在。
言歸正傳,C++為人詬病的一個很大原因是由於標准制定周期太長,沒有足夠多的標准的類庫支持新功能,新特性。完成XML操作,正則表達式,lambda表達式等等工作只能尋找第三方類庫了(插一句,新C++0x標准中右值操作真的很酷)。而使用XML進行軟件配置,或者數據存儲等等在軟件開發中是很常見的。所以閑來無事,寫個Demo玩一玩。我使用的第三方XML類庫是pugixml,基於DOM的,功能比較齊全,而且操作簡單。直接將pugixml.cpp,pugixml.hpp,pugiconfig.hpp拷貝到工程目錄中,在使用的時候include pugixml.hpp文件就成了。
(http://pugixml.googlecode.com/svn/tags/latest/docs/quickstart.html).

list<TaskNode> RetrivesDataFromXML() { list<TaskNode> taskList; xml_document doc; xml_parse_result result = doc.load_file("Config.xml"); for(xml_node task = doc.child("Tasks").child("Task"); task; task =task.next_sibling("Task")) { TaskNode t; map<string, string> nodeInfo; nodeInfo[task.attribute("id").value()] = task.attribute("description").value(); t.Info = nodeInfo; t.Architecture = task.child("Parameters").child("Architecture").text().as_string(); vector<string> langs; for(xml_node lang = task.child("Parameters").child("Languages").child("Value"); lang; lang = lang.next_sibling("Value")) { langs.push_back(lang.text().as_string()); } t.languages = langs; taskList.push_back(t); } return taskList; }
Demo代碼中想要開一進程打開cmd窗口,cmd窗口中調用測試程序,給測試程序傳遞從XML中讀取的配置參數。於是這就涉及到開進程。想想C++標准類庫中沒有,嘗試#include<process.h>還真有,那就沒跑了,MSDN一查,在Windows運行時庫中有有一堆_exec,_wexec的函數,掃了一眼嘗試調用一下,成功。但問題是進程開了,執行完之后沒有返回主進程,繼續執行,於是仔細看了看函數的介紹,發現一個_spawn,_wspawn,的函數群,於是跟電視賣葯小廣告所說的一樣,抱着試試看的態度買了一盒試了一下,真好使了。其實寫這篇文章就是為了備忘這一點和處理XML。
_exec,_wexec:加載(loads)並執行一個進程
_spawn,_wspawn:創建(Create)並執行一個進程。第一個參數為_P_OVERLAY 時就和_exec一個作用了。
http://msdn.microsoft.com/zh-cn/library/20y988d2.aspx
http://msdn.microsoft.com/zh-cn/library/431x4c1w(v=vs.80)
在當前進程開一個線程,可以使用Run time library中的_beginthread和_beginthreadex(process.h).也可以使用C++11中的線程支持庫,詳情參照ISO/IEC文檔,我使用的是免費的n3242,收費的正式版也很便宜。
int _tmain(int argc, _TCHAR* argv[])
{
/* Regex demo for C++11 .
* #include <regex>
string str = "Hello world";
Regex rx("Hello");
string replacement = "Hello nice";
assert( regex_search(str.begin(), str.end(), rx) );
string str2 = regex_replace(str,rx,replacement);
cout<<str2<<endl;
*/
/* thread&lambda demo for C++11
* #include <thread>
thread t([](){cout<<"hello"<<endl;});
cout<<t.get_id()<<endl;
bool is_even;
is_even = [](int n) { return n%2==0;}(41); //標准用法:[]聲明是lambda表達式,第一個()表明參數類型,{}函數體,第二個()傳遞參數。
*/
list<TaskNode> tasklist = RetrivesDataFromXML();
HandleData(tasklist);//_spawnlp(_P_WAIT, "cmd.exe","/?", NULL);
HANDLE hThread;
unsigned threadID;
hThread = (HANDLE)_beginthreadex(NULL, 0, &DisplayTask,NULL, 0, &threadID);
cout<<"Thread ID: "<<threadID<<endl;
WaitForSingleObject(hThread, INFINITE);
return 0;
}
Ref:
http://msdn.microsoft.com/zh-cn/library/kdzttdcb(v=vs.80)
http://www.sgi.com/tech/stl/
http://en.cppreference.com/w/
詳盡C++11的介紹和用法請參照:
http://www.codeproject.com/Articles/101886/Standard-C-Library-Changes-in-Visual-C-2010
http://www.codeproject.com/Articles/80825/Concurrency-Runtime-in-Visual-C-2010 C++ 並行編程詳解
http://msdn.microsoft.com/en-us/library/3bstk3k5