在连续看了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