﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-saiksy</title><link>http://www.cppblog.com/saiksy/</link><description>记录生活中的点点滴滴</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 08:02:00 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 08:02:00 GMT</pubDate><ttl>60</ttl><item><title>清空数据库,设置自动编号从1开始</title><link>http://www.cppblog.com/saiksy/archive/2011/08/01/152238.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Mon, 01 Aug 2011 14:08:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2011/08/01/152238.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/152238.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2011/08/01/152238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/152238.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/152238.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">"</span><span style="color: #000000">delete&nbsp;from&nbsp;tb_Cards</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;清空</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">ALTER&nbsp;TABLE&nbsp;tb_Cards&nbsp;ALTER&nbsp;COLUMN&nbsp;idx&nbsp;COUNTER&nbsp;(1,&nbsp;1)</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;自动编号设为1</span></div>
<p>&nbsp;</p><img src ="http://www.cppblog.com/saiksy/aggbug/152238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2011-08-01 22:08 <a href="http://www.cppblog.com/saiksy/archive/2011/08/01/152238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC中屏蔽ESC和回车关闭对话框</title><link>http://www.cppblog.com/saiksy/archive/2011/06/13/148561.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Sun, 12 Jun 2011 17:23:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2011/06/13/148561.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/148561.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2011/06/13/148561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/148561.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/148561.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">在CDialog::PreTranslateMessage()&nbsp;的重载函数中将ESC和回车按键的消息处理掉.<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />　　CResultCollectorDlg::PreTranslateMessage(MSG</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pMsg)<br /><img id="Codehighlighter1_123_328_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_328_Open_Text.style.display='none'; Codehighlighter1_123_328_Closed_Image.style.display='inline'; Codehighlighter1_123_328_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_123_328_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_328_Closed_Text.style.display='none'; Codehighlighter1_123_328_Open_Image.style.display='inline'; Codehighlighter1_123_328_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top">　　</span><span id="Codehighlighter1_123_328_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_123_328_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_160_277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_160_277_Open_Text.style.display='none'; Codehighlighter1_160_277_Closed_Image.style.display='inline'; Codehighlighter1_160_277_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_160_277_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_160_277_Closed_Text.style.display='none'; Codehighlighter1_160_277_Open_Image.style.display='inline'; Codehighlighter1_160_277_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">　　</span><span style="color: #0000ff">if</span><span style="color: #000000">(pMsg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">message&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;WM_KEYDOWN)&nbsp;</span><span id="Codehighlighter1_160_277_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_160_277_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_186_272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_186_272_Open_Text.style.display='none'; Codehighlighter1_186_272_Closed_Image.style.display='inline'; Codehighlighter1_186_272_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_186_272_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_186_272_Closed_Text.style.display='none'; Codehighlighter1_186_272_Open_Image.style.display='inline'; Codehighlighter1_186_272_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">　　</span><span style="color: #0000ff">switch</span><span style="color: #000000">(pMsg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">wParam)&nbsp;</span><span id="Codehighlighter1_186_272_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_186_272_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;VK_RETURN:&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">回车</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;TRUE;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;VK_ESCAPE:&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ESC</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;TRUE;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;CDialog::PreTranslateMessage(pMsg);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p><img src ="http://www.cppblog.com/saiksy/aggbug/148561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2011-06-13 01:23 <a href="http://www.cppblog.com/saiksy/archive/2011/06/13/148561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC2008常用快捷键</title><link>http://www.cppblog.com/saiksy/archive/2011/05/31/147766.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Tue, 31 May 2011 09:43:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2011/05/31/147766.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/147766.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2011/05/31/147766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/147766.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/147766.html</trackback:ping><description><![CDATA[<p><strong><span style="color: #008000">标准组合键</span></strong><br />关闭应用程序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alt + F4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭 IDE。<br />关闭文档窗口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + F4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭当前活动的文档窗口。<br />移动到菜单栏&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 激活主 IDE 菜单栏。<br />移动到下一工具栏&nbsp;&nbsp;&nbsp; Ctrl + Tab&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 移动到下一个可见的工具栏。仅在主菜单栏处于活动状态时可用。<br />移动到前一个工具栏&nbsp; Ctrl + Shift + Tab&nbsp;&nbsp;&nbsp; 移动到前一个可见的工具栏。仅在主菜单栏处于活动状态时可用。<br />&nbsp;<br /><strong><span style="color: #008000">文本操作快捷键</span><br /></strong>编辑.完成单词&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alt + 向右键- 或 -Ctrl + 空格键&nbsp;&nbsp;&nbsp; 显示基于当前语言的&#8220;完整单词&#8221;。<br />&nbsp; <br />窗口管理快捷键<br />视图.全屏&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shift + Alt+ Enter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 切换&#8220;全屏&#8221;模式的打开和关闭。<br />视图.类视图&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + Shift + C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示&#8220;类视图&#8221;窗口。<br />视图.资源视图&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + Shift + E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示&#8220;资源视图&#8221;窗口。<br />视图.解决方案资源管理器&nbsp; Ctrl + Alt + L&nbsp; 显示解决方案资源管理器，它列出当前解决方案中的项目和文件。<br />&nbsp;<br />项目快捷键<br />生成.编译&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + F7&nbsp; <br />生成.生成解决方案&nbsp;&nbsp;&nbsp; F7<br />文件.新建文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + N<br />文件.新建项目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + Shift + N<br />文件.打开文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + O<br />文件.打开项目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + Shift + O</p>
<p>调试快捷键<br />调试.断点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置或取消断点<br />调试.启用断点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + F9&nbsp; 将断点从禁用切换到启用<br />调试.删除所有断点&nbsp; Ctrl + Shift + F9&nbsp;&nbsp; 清除项目中的所有断点。</p>
<p>文本选择快捷键<br />编辑.向左扩展一个字符&nbsp; Shift + 向左键&nbsp; 将光标左移一个字符以扩展所选内容。<br />编辑.向右扩展一个字符&nbsp; Shift + 向右键&nbsp; 将光标右移一个字符以扩展所选内容。<br />编辑.文档结尾扩展&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + Shift + End&nbsp; 选择从插入点到文档最后一行的文本。<br />编辑.文档开始扩展&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl + Shift + Home&nbsp; 选择从插入点到文档首行的文本。<br />编辑.向下扩展一行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shift + 向下键&nbsp;&nbsp;&nbsp; 从插入点位置开始，将选定文本向下扩展一行。<br />编辑.扩展到行尾&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shift + End&nbsp;&nbsp; 选择从插入点到当前行行尾的文本。<br />编辑.扩展到行首&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shift + Home&nbsp;&nbsp; 选择从插入点到行首的文本。<br />编辑.向上扩展一行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shift + 向上键&nbsp; 从插入点位置开始向上逐行选择文本。 <br />编辑.向下扩展一页&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shift + Page Down&nbsp; 将选定内容向下扩展一页。<br />编辑.向上扩展一页&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shift + Page Up</p>
<p><br />对象浏览器快捷键<br />编辑.转到声明&nbsp; Ctrl + F12&nbsp; 显示代码中选定符号的定义。<br />编辑.转到定义&nbsp; F12&nbsp; 显示代码中选定符号的声明。</p>
<p>类关系图快捷键<br />类关系图.折叠&nbsp;&nbsp; 数字键区中的 -（减号） 折叠&#8220;类详细信息&#8221;窗口中展开的节点，或折叠关系图中选定的形状隔离舱。 <br />类关系图.展开&nbsp;&nbsp; 数字键区中的 +（加号） 展开&#8220;类详细信息&#8221;窗口中折叠的节点，或展开关系图中选定的形状隔离舱。</p><img src ="http://www.cppblog.com/saiksy/aggbug/147766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2011-05-31 17:43 <a href="http://www.cppblog.com/saiksy/archive/2011/05/31/147766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tokenizes a string into a vector</title><link>http://www.cppblog.com/saiksy/archive/2011/05/31/147755.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Tue, 31 May 2011 06:30:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2011/05/31/147755.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/147755.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2011/05/31/147755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/147755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/147755.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Tokenizes&nbsp;a&nbsp;string&nbsp;into&nbsp;a&nbsp;vector</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">std::vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;TokenizeString(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;str,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;delim)<br /><img id="Codehighlighter1_126_515_Open_Image" onclick="this.style.display='none'; Codehighlighter1_126_515_Open_Text.style.display='none'; Codehighlighter1_126_515_Closed_Image.style.display='inline'; Codehighlighter1_126_515_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_126_515_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_126_515_Closed_Text.style.display='none'; Codehighlighter1_126_515_Open_Image.style.display='inline'; Codehighlighter1_126_515_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_126_515_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_126_515_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.gamedev.net/community/forums/topic.asp?topic_id=381544</span><span style="color: #008000">#TokenizeString</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;tokens;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;p0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;p1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">::npos;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(p0&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">::npos)<br /><img id="Codehighlighter1_322_497_Open_Image" onclick="this.style.display='none'; Codehighlighter1_322_497_Open_Text.style.display='none'; Codehighlighter1_322_497_Closed_Image.style.display='inline'; Codehighlighter1_322_497_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_322_497_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_322_497_Closed_Text.style.display='none'; Codehighlighter1_322_497_Open_Image.style.display='inline'; Codehighlighter1_322_497_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_322_497_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_322_497_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str.find_first_of(delim,&nbsp;p0);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(p1&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;p0)<br /><img id="Codehighlighter1_378_453_Open_Image" onclick="this.style.display='none'; Codehighlighter1_378_453_Open_Text.style.display='none'; Codehighlighter1_378_453_Closed_Image.style.display='inline'; Codehighlighter1_378_453_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_378_453_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_378_453_Closed_Text.style.display='none'; Codehighlighter1_378_453_Open_Image.style.display='inline'; Codehighlighter1_378_453_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_378_453_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_378_453_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;token&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str.substr(p0,&nbsp;p1&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;p0);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokens.push_back(token);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str.find_first_not_of(delim,&nbsp;p1);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;tokens;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div><img src ="http://www.cppblog.com/saiksy/aggbug/147755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2011-05-31 14:30 <a href="http://www.cppblog.com/saiksy/archive/2011/05/31/147755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;使用luabind的第一段代码</title><link>http://www.cppblog.com/saiksy/archive/2011/05/19/146719.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Wed, 18 May 2011 17:08:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2011/05/19/146719.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/146719.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2011/05/19/146719.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/146719.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/146719.html</trackback:ping><description><![CDATA[<p>既然是从零开始,那么就搞的傻瓜一点,就算是手把手教了. 哈哈.</p>
<p>一下内容在vs2005实现</p>
<p>新建一个空的win32控制台项目.</p>
<p>1.首先我们来配置头文件和库文件:</p>
<p>头文件:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">D:\Lua\lua</span><span style="color: #000000">-</span><span style="color: #000000">5.1</span><span style="color: #000000">.</span><span style="color: #000000">4</span><span style="color: #000000">\src<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />D:\Lua\luabind</span><span style="color: #000000">-</span><span style="color: #000000">0.8</span><span style="color: #000000">.</span><span style="color: #000000">1</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />D:\Lua\boost_1_41_0<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>库文件:无.见代码.</p>
<p>&nbsp;<wbr></p>
<p>下面就是cpp内容了:注释都是个人理解,如果您觉得不对</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">luabind</span><span style="color: #000000">/</span><span style="color: #000000">luabind.hpp</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />#pragma&nbsp;comment(lib,</span><span style="color: #000000">"</span><span style="color: #000000">lualib.lib</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">可能你会问,lualib.lib是哪里来的?&nbsp;这是我自己编译luabind得到<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">的,&nbsp;&nbsp;如果你不知道怎么编译,参考下我的另一篇文章&lt;从零开始使用luabind&gt;</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;luabind;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;testlua</span><span style="color: #008000">//</span><span style="color: #008000">写一个测试类,包括一些简单的方法.</span><span style="color: #008000"><br /><img id="Codehighlighter1_252_416_Open_Image" onclick="this.style.display='none'; Codehighlighter1_252_416_Open_Text.style.display='none'; Codehighlighter1_252_416_Closed_Image.style.display='inline'; Codehighlighter1_252_416_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_252_416_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_252_416_Closed_Text.style.display='none'; Codehighlighter1_252_416_Open_Image.style.display='inline'; Codehighlighter1_252_416_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_252_416_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_252_416_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img id="Codehighlighter1_294_295_Open_Image" onclick="this.style.display='none'; Codehighlighter1_294_295_Open_Text.style.display='none'; Codehighlighter1_294_295_Closed_Image.style.display='inline'; Codehighlighter1_294_295_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_294_295_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_294_295_Closed_Text.style.display='none'; Codehighlighter1_294_295_Open_Image.style.display='inline'; Codehighlighter1_294_295_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;testlua(std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;s):m_str(s)</span><span id="Codehighlighter1_294_295_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_294_295_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;myprint()<br /><img id="Codehighlighter1_315_343_Open_Image" onclick="this.style.display='none'; Codehighlighter1_315_343_Open_Text.style.display='none'; Codehighlighter1_315_343_Closed_Image.style.display='inline'; Codehighlighter1_315_343_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_315_343_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_315_343_Closed_Text.style.display='none'; Codehighlighter1_315_343_Open_Image.style.display='inline'; Codehighlighter1_315_343_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;</span><span id="Codehighlighter1_315_343_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_315_343_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;m_str&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_372_384_Open_Image" onclick="this.style.display='none'; Codehighlighter1_372_384_Open_Text.style.display='none'; Codehighlighter1_372_384_Closed_Image.style.display='inline'; Codehighlighter1_372_384_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_372_384_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_372_384_Closed_Text.style.display='none'; Codehighlighter1_372_384_Open_Image.style.display='inline'; Codehighlighter1_372_384_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setstr(std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;s)</span><span id="Codehighlighter1_372_384_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_372_384_Open_Text"><span style="color: #000000">{&nbsp;m_str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s;}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;m_str;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_432_924_Open_Image" onclick="this.style.display='none'; Codehighlighter1_432_924_Open_Text.style.display='none'; Codehighlighter1_432_924_Closed_Image.style.display='inline'; Codehighlighter1_432_924_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_432_924_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_432_924_Closed_Text.style.display='none'; Codehighlighter1_432_924_Open_Image.style.display='inline'; Codehighlighter1_432_924_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_432_924_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_432_924_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;lua_State&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">L&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;luaL_newstate();</span><span style="color: #008000">//</span><span style="color: #008000">新建一个lua_State,或者叫做创建lua状态</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;luabind::open(L);</span><span style="color: #008000">//</span><span style="color: #008000">为改lua状态打开所有lua库<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">把写好的类绑定到lua,以下内容为读书所得,我看的是missdeer同学翻译的luabindmanual一书.<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">相信好学的你,如果不明白这是怎么用的,一定会找来这书读一读的,当然我也很乐意和您分享(Q:625425901)</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;module(L)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />[&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;class_</span><span style="color: #000000">&lt;</span><span style="color: #000000">testlua</span><span style="color: #000000">&gt;</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">testlua</span><span style="color: #000000">"</span><span style="color: #000000">)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;.def(constructor</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">())<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000">"</span><span style="color: #000000">myprint</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">&amp;</span><span style="color: #000000">testlua::myprint)</span><span style="color: #008000">//</span><span style="color: #008000">开放这两个函数给lua使用</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000">"</span><span style="color: #000000">setstr</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">testlua::setstr)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;luaL_dofile(L,</span><span style="color: #000000">"</span><span style="color: #000000">test.lua</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">执行lua文件,稍后你会看到test.lua文件的内容</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;lua_close(L);</span><span style="color: #008000">//</span><span style="color: #008000">关闭lua状态</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />以下是test.lua内容:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />local&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;testlua(</span><span style="color: #000000">"</span><span style="color: #000000">hello&nbsp;lua!</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #000000">--</span><span style="color: #000000">看不懂</span><span style="color: #000000">?</span><span style="color: #000000">如果我说它在c里是这样的:&nbsp;testlua&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;testlua(</span><span style="color: #000000">"</span><span style="color: #000000">hello&nbsp;lua!</span><span style="color: #000000">"</span><span style="color: #000000">),看懂了么</span><span style="color: #000000">?</span><span style="color: #000000">恩,构建testlua类的对象.<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />a:myprint();</span><span style="color: #008000">//</span><span style="color: #008000">调用方法</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />a:setstr(</span><span style="color: #000000">"</span><span style="color: #000000">yes&nbsp;lua!</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />a:myprint();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">--</span><span style="color: #000000">接下来我们在lua里尝试如下代码:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />a:hisprint();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">--</span><span style="color: #000000">你也许会问,这个函数不存在啊.确实不存在,但是程序并没有报错,所以或许我们需要其他的代码来处理这种错误的调用,后话了,慢慢来.<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />好了,执行一下C代码,你应该会看到想要的结果了.相信不少同学看到这里已经开始计划写一个类,用来随心所欲的开放你的C方法给lua使用了.先到这里.<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>欢迎批评指正.</p>
<p>&nbsp;<wbr></p><img src ="http://www.cppblog.com/saiksy/aggbug/146719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2011-05-19 01:08 <a href="http://www.cppblog.com/saiksy/archive/2011/05/19/146719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;从零开始使用luabind</title><link>http://www.cppblog.com/saiksy/archive/2011/05/18/146714.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Wed, 18 May 2011 15:35:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2011/05/18/146714.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/146714.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2011/05/18/146714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/146714.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/146714.html</trackback:ping><description><![CDATA[<p>那么好吧,我们来试试luabind.以下内容参考了不少网上的教程,由于被多方转载,已经不知道作者是谁了,在这里对他们表示万分的感谢.</p>
<p>使用vs2005编译luabind</p>
<p><span style="display: block; font-weight: bolder; word-break: break-all; padding-top: 25px">红色部分是我自己编译的时候遇到的一些问题,或者应该注意的地方</span></p>
<ol><li>下载lua <font color="#ff0000">(我使用的版本 lua-5.1.4)</font><br />从官方网站<a href="http://www.lua.org/download.html" target="_blank"><font color="#800080"><u>http://www.lua.org/download.html</u></font></a>可得到源码包.</li><li>编译lua<br />使用VS.NET环境的使用VS提供的"Visual Studio命令提示",进入解开的源码包根目录下,按readme文提示,运行etc\luavs.bat,一般即可编译成功.</li><li>对于使用lua的开发者来说,可以直接到<a href="http://luabinaries.luaforge.net/download.html" target="_blank"><font color="#0000ff"><u>http://luabinaries.luaforge.net/download.html</u></font></a>下载编译后版本.</li><li>下载boost <font color="#ff0000">(我用的boost_1_41_0)<br /></font>从官方网站<a href="http://www.boost.org/users/download/" target="_blank"><font color="#0000ff"><u>http://www.boost.org/users/download/</u></font></a>下载源码包.</li><li>编译bjam&nbsp;<wbr><br />从VS命令提示进入&lt;boost_root&gt;\tools\jam\src\,运行build.bat. 根据需要可以使用各种参数,比如希望使用vc8(VS 2005),则运行 build.bat vc8.<br />生成的目标文件在&lt;boost_root&gt;\tools\jam\src\bin.ntx86\bjam.exe.</li><li>编译boost<br />将bjam.exe拷贝到&lt;boost_root&gt;目录下,在VS命令提示进入&lt;boost_root&gt;,运行bjam. 其他参数请自行查询.<br />&nbsp;<wbr> 编译时间比较长,生成的目标文件在&lt;boost_root&gt;\bin.v2\libs<font color="#ff0066">.(或者在&lt;boost_root&gt; 新建一个bat,写入如下内容: bjam --toolset=msvc-8.0 --stagedir=./lib_x86 --builddir=./ address-model=32 link=static runtime-link=static threading=multi stage debug release<br />bjam --toolset=msvc-8.0 --stagedir=./lib_x64 --builddir=./ address-model=64 link=static runtime-link=static threading=multi stage debug release&nbsp;<wbr>,参数自己按需要修改.这样你就可以直接用vs命令提示运行这个bat文件了.&nbsp;<wbr> )</font></li><li>下载luabind<br />从<a href="http://sourceforge.net/projects/luabind/" target="_blank"><font color="#800080"><u>http://sourceforge.net/projects/luabind/</u></font></a>下载源码包. <font color="#ff0000">(我用的luabind-0.8.1.开始的时候用的0.9rc1,编不过去)</font></li><li>编译luabind<br />使用VS新建win32项目,新建选项为静态库Static Link Library，不使用预编译头Precompiled header. 将&lt;luabind_root&gt;\src下所有cpp文件加入工程. 将&lt;boost_root&gt;,&lt;lua_root&gt;\src,&lt;luabind_root&gt;加入附加包含路径.<br />编译luabind.lib. </li></ol>
<p><font color="#ff0000">另外,我修改了boost_1_41_0\tools\build\v2\user-config.jam文件中的 # using msvc : 8.0;</font></p>
<p><font color="#ff0000">改后: # using msvc : 8.0 : : &lt;compileflags&gt;/wd4819 &lt;compileflags&gt;/D_CRT_SECURE_NO_DEPRECATE &lt;compileflags&gt;/D_SCL_SECURE_NO_DEPRECATE &lt;compileflags&gt;/D_SECURE_SCL=0 ;</font></p>
<p><font color="#ff0000">不知道这会不会对编译造成影响.</font></p><img src ="http://www.cppblog.com/saiksy/aggbug/146714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2011-05-18 23:35 <a href="http://www.cppblog.com/saiksy/archive/2011/05/18/146714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> &lt;转&gt;Windows 线程漫谈——界面线程和工作者线程 </title><link>http://www.cppblog.com/saiksy/archive/2011/05/18/146706.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Wed, 18 May 2011 14:43:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2011/05/18/146706.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/146706.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2011/05/18/146706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/146706.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/146706.html</trackback:ping><description><![CDATA[<p>每个系统都有线程，而线程的最重要的作用就是并行处理，提高软件的并发率。针对界面来说，还能提高界面的响应力。</p>
<p>&nbsp;线程分为界面线程和工作者线程，界面实际就是一个线程画出来的东西，这个线程维护一个&#8220;消息队列&#8221;，&#8220;消息队列&#8221;也是界面线程和工作者线程的最大区别，这个词应该进到你的脑子里，根深蒂固的！</p>
<p>如果在界面线程的某个地方停住，这说明它处理不了窗口消息了，所以有时候我们就会看到整个界面无响应了。这种问题后面会提供一个叫　WaitForObjectEx　的函数来解决，我们后面再谈。</p>
<p>线程首先就是它的创建，创建是用下面这个函数：CreateThread;　具体的参数我不说了，自己查ＭＳＤＮ。其中的　Thread1　是线程函数。线程函数是一个全局函数，如下：</p>
<p>DWORD WINAPI Thread1(LPVOID lpParam)<br />{<br />&nbsp; while(1)<br />&nbsp;{<br />&nbsp; OutputDebugString("11111");</p>
<p>&nbsp; Sleep(10);<br />&nbsp;}<br />&nbsp;return 0;<br />}</p>
<p>// 下面这一句是创建线程<br />CreateThread(NULL, 0, Thread1, 0, 0, NULL);</p>
<p>当然我们不能让一个线程自生自灭，那样有可能在你退出程序的时候出现一些莫名其妙的问题，或者丢失一些数据，或者给你弹一个崩溃的对话框等等。。。</p>
<p>所以我们就要对这个线程进行管理，首先就是让它退出。</p>
<p>我们给它的while加上一个 BOOL 变量 g_bExitThread的判断，这样的话，线程函数就变成下面这样：</p>
<p>DWORD WINAPI Thread1(LPVOID lpParam)<br />{<br />&nbsp; while(!g_bExitThread)<br />&nbsp;{<br />&nbsp; OutputDebugString("11111");</p>
<p>&nbsp; Sleep(10);<br />&nbsp;}<br />&nbsp;return 0;<br />}</p>
<p>然后在需要它退出的时候把g_bExitThread设为TRUE，表示，喂，兄弟，你该退出了。</p>
<p>当然我们还要知道它是否成功退出了，因为线程句柄是一个内核对象，所以我们就要用到Windows的WaitForSingleObject来等待了。创建的时候和等待它退出的代码就要改变了，多了一个 HANDLE g_hTrd的变量：</p>
<p>// 创建<br />g_bExitThread = FALSE;<br />g_hTrd = CreateThread(NULL, 0, Thread1, 0, 0, NULL);</p>
<p>// 等待线程结束<br />g_bExitThread = TRUE;</p>
<p>&nbsp;if(g_hTrd != NULL)<br />&nbsp;{<br />&nbsp; DWORD dwRet = WaitForSingleObject(g_hTrd, 5000);<br />&nbsp; if(dwRet == WAIT_OBJECT_0)<br />&nbsp; {<br />&nbsp;&nbsp; AfxMessageBox("Thread exit success!");<br />&nbsp; }<br />&nbsp; else<br />&nbsp; {<br />&nbsp;&nbsp; DWORD dwRet = 0;<br />&nbsp;&nbsp; GetExitCodeThread(g_hTrd, &amp;dwRet);<br />&nbsp;&nbsp; TerminateThread(g_hTrd, dwRet);<br />&nbsp;&nbsp; AfxMessageBox("Thread exit, but not all ok!");<br />&nbsp; }<br />&nbsp; CloseHandle(g_hTrd);<br />&nbsp; g_hTrd = NULL;<br />&nbsp;}</p>
<p>上面说了在界面线程里等待别的线程结束，也就是使用 WaitForSingleObject 的时候会阻塞整个窗口消息的处理，所以我们如果在界面线程里要等待别的内核对象时，我们要采用这种&#8220;等一下，处理一下界面消息&#8221;的方法。我已经写好了一个 WaitForObjectEx 的函数，如下：</p>
<p>// 此函数只能用于界面线程<br />static DWORD WaitForObjectEx( HANDLE hHandle, DWORD dwMilliseconds )<br />{<br />&nbsp;BOOL bRet;<br />&nbsp;MSG msg;<br />&nbsp;INT iWaitRet;<br />&nbsp;int nTimeOut = 0;<br />&nbsp;while( (bRet = ::GetMessage( &amp;msg, NULL, 0, 0 )) != 0)<br />&nbsp;{ <br />&nbsp; if(nTimeOut++ * 20 &gt;= dwMilliseconds)<br />&nbsp;&nbsp; break;</p>
<p>&nbsp; iWaitRet = WaitForSingleObject(hHandle, 20);<br />&nbsp; if(iWaitRet != WAIT_TIMEOUT)<br />&nbsp; {<br />&nbsp;&nbsp; break;<br />&nbsp; }<br />&nbsp; if (bRet == -1)<br />&nbsp; {<br />&nbsp;&nbsp; break;<br />&nbsp; }<br />&nbsp; else<br />&nbsp; {<br />&nbsp;&nbsp; ::TranslateMessage(&amp;msg); <br />&nbsp;&nbsp; ::DispatchMessage(&amp;msg); <br />&nbsp; }<br />&nbsp;}</p>
<p>&nbsp;return iWaitRet;<br />}</p>
<p>很多时候，我们不想把线程作为一个全局函数来使用，所以这个时候我们把线程作为一个类的静态成员对象来写。当然也不能少了刚才的两个变量：退出标志和线程句柄。（设这个类是CTestThreadDlg）</p>
<p>// H 文件 <br />BOOL m_bExitThread;<br />&nbsp;HANDLE m_hTrd;<br />&nbsp;static DWORD WINAPI Thread1(LPVOID lpParam);</p>
<p>// CPP文件，创建的时候把 this 指针传进去，因为类静态成员函数不能访问类的非静态成员，没有this指针<br />//（C++的知识点）<br />&nbsp;m_bExitThread = FALSE;<br />&nbsp;m_hTrd = CreateThread(NULL, 0, Thread1, this, 0, NULL);</p>
<p>线程函数变成了：</p>
<p>&nbsp;DWORD WINAPI CTestThreadDlg::Thread1(LPVOID lpParam)<br />&nbsp;{<br />&nbsp; CTestThreadDlg *pDlg = (CTestThreadDlg*)lpParam;<br />&nbsp; while(!pDlg-&gt;m_bExitThread)<br />&nbsp; {<br />&nbsp;&nbsp; OutputDebugString("11111");<br />&nbsp; <br />&nbsp;&nbsp; Sleep(10);<br />&nbsp; }<br />&nbsp; return 0;<br />&nbsp;}</p>
<p>&nbsp;</p>
<p>当有几个线程一起跑的时候，我们就要注意线程的同步问题了，线程的同步一般来说，是在多个线程共用了资源的时候。比如两个线程都用到了同一个VECTOR，都对VECTOR进行插入操作，不幸的是，VECTOR不是线程安全的，这个时候程序就会崩溃，所以我们就要对VECTOR这个资源做同步，同步的意思是&#8220;我访问的时候，你等待&#8221;。程序大致如下：</p>
<p>DWORD WINAPI CTestThreadDlg::Thread1(LPVOID lpParam)<br />&nbsp;{<br />&nbsp; CTestThreadDlg *pDlg = (CTestThreadDlg*)lpParam;<br />&nbsp; while(!pDlg-&gt;m_bExitThread)<br />&nbsp; {<br />&nbsp;&nbsp; OutputDebugString("11111");<br />&nbsp;<br />&nbsp;&nbsp; pDlg-&gt;m_csForVec.Lock();<br />&nbsp;&nbsp; pDlg-&gt;m_vecTest.push_back("111");<br />&nbsp;&nbsp; pDlg-&gt;m_csForVec.Unlock();<br />&nbsp;<br />&nbsp;&nbsp; Sleep(10);<br />&nbsp; }<br />&nbsp; return 0;<br />&nbsp;}</p>
<p>DWORD WINAPI CTestThreadDlg::Thread2(LPVOID lpParam)<br />{<br />&nbsp;CTestThreadDlg *pDlg = (CTestThreadDlg*)lpParam;<br />&nbsp;while(!pDlg-&gt;m_bExitThread2)<br />&nbsp;{<br />&nbsp; OutputDebugString("222");</p>
<p>&nbsp; pDlg-&gt;m_csForVec.Lock();<br />&nbsp; pDlg-&gt;m_vecTest.push_back("222");<br />&nbsp; pDlg-&gt;m_csForVec.Unlock(); </p>
<p>&nbsp; Sleep(10);<br />&nbsp;}<br />&nbsp;return 0;<br />}</p>
<p>m_csForVec 是一个CCriticalSection变量，这个同步对象和其他的同步变量（事件、信号量、互斥区等）有一些不一样，例如只能在同一个进程的线程间访问、在操作系统的用户态访问，其他的必须进入核心态。所以这样导致了这种关键区的核心对象的速度要比其他的快100倍左右。。。</p>
<p>上面已经说了线程的创建、管理（退出线程、等待线程）、同步等，那我们发现了什么共性呢？作为一个程序员，我们要很敏感的发现这些代码上的共性，这是我们设计代码的主要前提。</p>
<p>首先我们发现上面的线程都有两个变量： <br />BOOL m_bExitThread;&nbsp; // 让线程退出的标志<br />&nbsp;HANDLE m_hTrd;&nbsp; // 线程句柄</p>
<p>另外我们WaitForSingleObject 的时候不能无限等待，所以要多一个 DWORD m_dwWaitTimeOut; </p>
<p>由于我想把线程启动和结束封装起来，所以我设计了这几个接口：</p>
<p>&nbsp;BOOL Start(LPVOID lpParam);&nbsp; //&nbsp; 启动线程，线程所需要的参数从这里传进<br />&nbsp;BOOL End(); // 结束线程<br />&nbsp;virtual void Run(); // 重写Run函数</p>
<p>所以整个的线程封装成以下的类：</p>
<p>// MyThread.h</p>
<p>#ifndef MY_THREAD_H<br />#define MY_THREAD_H</p>
<p>class CMyThread<br />{<br />public:<br />&nbsp;CMyThread();<br />&nbsp;virtual ~CMyThread();</p>
<p>&nbsp;BOOL Start(LPVOID lpParam);<br />&nbsp;BOOL End();<br />&nbsp;virtual void Run();</p>
<p>protected:<br />&nbsp;static DWORD WINAPI Thread(LPVOID lpParam);<br />&nbsp;void RunOnceEnd();</p>
<p>&nbsp;DWORD m_dwWaitTimeOut;<br />&nbsp;BOOL m_bExitThread;<br />&nbsp;HANDLE m_hTrd;<br />&nbsp;LPVOID m_lpParam;<br />};</p>
<p>#endif</p>
<p>// MyThread.Cpp</p>
<p>#include "stdafx.h"<br />#include "MyThread.h"<br />/////////////////////////////////////////////////////////////////////////////<br />// CMyThread<br />CMyThread::CMyThread()<br />{<br />&nbsp;m_bExitThread = FALSE;<br />&nbsp;m_hTrd = NULL;<br />&nbsp;m_dwWaitTimeOut = 5000;<br />}</p>
<p>CMyThread::~CMyThread()<br />{</p>
<p>}</p>
<p>BOOL CMyThread::Start(LPVOID lpParam)<br />{<br />&nbsp;m_lpParam = lpParam;<br />&nbsp;m_bExitThread = FALSE;<br />&nbsp;m_hTrd = CreateThread(NULL, 0, Thread, this, 0, NULL);</p>
<p>&nbsp;return TRUE;<br />}</p>
<p>BOOL CMyThread::End()<br />{<br />&nbsp;m_bExitThread = TRUE;</p>
<p>&nbsp;if(m_hTrd != NULL)<br />&nbsp;{<br />&nbsp; DWORD dwRet = WaitForSingleObject(m_hTrd, m_dwWaitTimeOut);<br />&nbsp; if(dwRet == WAIT_OBJECT_0)<br />&nbsp; {<br />&nbsp;&nbsp; AfxMessageBox("Thread exit success!");<br />&nbsp; }<br />&nbsp; else<br />&nbsp; {<br />&nbsp;&nbsp; DWORD dwRet = 0;<br />&nbsp;&nbsp; GetExitCodeThread(m_hTrd, &amp;dwRet);<br />&nbsp;&nbsp; TerminateThread(m_hTrd, dwRet);<br />&nbsp;&nbsp; AfxMessageBox("Thread fucking exit!");<br />&nbsp; }</p>
<p>&nbsp; CloseHandle(m_hTrd);<br />&nbsp; m_hTrd = NULL;<br />&nbsp;}<br />&nbsp;<br />&nbsp;return TRUE;<br />}</p>
<p>DWORD WINAPI CMyThread::Thread(LPVOID lpParam)<br />{<br />&nbsp;CMyThread *pTrd = (CMyThread *)lpParam;<br />&nbsp;<br />&nbsp;while(!pTrd-&gt;m_bExitThread)<br />&nbsp;{<br />&nbsp; pTrd-&gt;Run();<br />&nbsp;}</p>
<p>&nbsp;return 0;<br />}</p>
<p>void CMyThread::RunOnceEnd()<br />{<br />&nbsp;m_bExitThread = TRUE;<br />&nbsp;CloseHandle(m_hTrd);<br />&nbsp;m_hTrd = NULL;<br />}</p>
<p>void CMyThread::Run()<br />{<br />}</p>
<p>我们需要写我们自己的线程的时候就重载一下这个Run函数</p>
<p>// 派生出一个类<br />class CMyThread1 : public CMyThread<br />{<br />public:<br />&nbsp;virtual void Run();<br />};</p>
<p>// 改写Run函数<br />void CMyThread1::Run()<br />{<br />&nbsp;CTestThreadDlg *pDlg = (CTestThreadDlg *)m_lpParam;</p>
<p>&nbsp;OutputDebugString("222");<br />&nbsp;<br />&nbsp;pDlg-&gt;m_csForVec.Lock();<br />&nbsp;pDlg-&gt;m_vecTest.push_back("222");<br />&nbsp;pDlg-&gt;m_csForVec.Unlock(); <br />&nbsp;<br />&nbsp;Sleep(10);</p>
<p>&nbsp;// 如果此线程只想运行一次，加上下面这句<br />&nbsp;RunOnceEnd();<br />}</p>
<p><br />然后我们之前的两个线程的使用就变成了下面的形式：</p>
<p>CMyThread1 g_t1, g_t2, g_t3;<br />void CTestThreadDlg::OnButton3() <br />{<br />&nbsp;g_t1.Start(this);<br />&nbsp;g_t2.Start(this);<br />&nbsp;g_t3.Start(this); <br />}</p>
<p>void CTestThreadDlg::OnButton4() <br />{<br />&nbsp;g_t1.End();<br />&nbsp;g_t2.End();<br />&nbsp;g_t3.End();&nbsp; <br />}</p>
<p>只需要以下几步：<br />1、派生自己的线程类<br />2、重载Run函数<br />3、调用Start启动线程<br />4、调用End结束线程</p>
<p>当然这种封装方式是我自己喜欢的，封装的目的是方便使用，隐藏细节，诸位看官也可以根据自己的喜好，封装线程的使用方法，如果能在此公开一下你的成果，让我和大家都学习一下你的设计手法，那就真是very good and 3q了！</p>
<p>&nbsp;</p>
<p><br />本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/dylgsy/archive/2008/03/13/2176160.aspx">http://blog.csdn.net/dylgsy/archive/2008/03/13/2176160.aspx</a></p><img src ="http://www.cppblog.com/saiksy/aggbug/146706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2011-05-18 22:43 <a href="http://www.cppblog.com/saiksy/archive/2011/05/18/146706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转帖&gt;一句代码提升进程权限</title><link>http://www.cppblog.com/saiksy/archive/2011/05/08/145959.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Sun, 08 May 2011 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2011/05/08/145959.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/145959.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2011/05/08/145959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/145959.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/145959.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,1,0,NULL);这个函数封装在NtDll.dll中（在所有DLL加载之前加载），被微软严格保密，就是说你在MSDN上查不到关于他的任何信息。.常量&nbsp;SE_BACKUP_PRIVILEGE,&nbsp;"17",&nbsp;公开.常量&nbsp;SE_RESTORE_PRIVILEGE,&nbsp;"18",&...&nbsp;&nbsp;<a href='http://www.cppblog.com/saiksy/archive/2011/05/08/145959.html'>阅读全文</a><img src ="http://www.cppblog.com/saiksy/aggbug/145959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2011-05-08 17:22 <a href="http://www.cppblog.com/saiksy/archive/2011/05/08/145959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建Console并重定向printf</title><link>http://www.cppblog.com/saiksy/archive/2011/05/05/145765.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Thu, 05 May 2011 09:46:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2011/05/05/145765.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/145765.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2011/05/05/145765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/145765.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/145765.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">-------------------------------------------<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">当想在Win32&nbsp;Application时想在控制台输出一些调试<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">信息,可以先创建一个控制台,再重定向输入,输出<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">-------------------------------------------</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">AllocConsole();&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;handle&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;GetStdHandle(STD_OUTPUT_HANDLE);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;hCrt&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;_open_osfhandle((</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">)handle,_O_TEXT);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;hf&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;_fdopen(&nbsp;&nbsp;&nbsp;hCrt,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">w</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">stdout&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">hf;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;setvbuf(&nbsp;stdout,&nbsp;NULL,&nbsp;_IONBF,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;FOREGROUND_GREEN);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">改变控制台文本颜色</span></div>
<img src ="http://www.cppblog.com/saiksy/aggbug/145765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2011-05-05 17:46 <a href="http://www.cppblog.com/saiksy/archive/2011/05/05/145765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统菜单</title><link>http://www.cppblog.com/saiksy/archive/2010/09/13/126538.html</link><dc:creator>saiksy</dc:creator><author>saiksy</author><pubDate>Mon, 13 Sep 2010 15:09:00 GMT</pubDate><guid>http://www.cppblog.com/saiksy/archive/2010/09/13/126538.html</guid><wfw:comment>http://www.cppblog.com/saiksy/comments/126538.html</wfw:comment><comments>http://www.cppblog.com/saiksy/archive/2010/09/13/126538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/saiksy/comments/commentRss/126538.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/saiksy/services/trackbacks/126538.html</trackback:ping><description><![CDATA[在系统菜单中增加的命令其ID值必须小于0xF000；否则它们将会与Windows系 <br>统菜单命令所使用的ID值相冲突。还要记住，当您为这些新菜单项在窗口消息处理程序中处理 <br>WM_SYSCOMMAND&nbsp; 消&nbsp; 息&nbsp; 时&nbsp; ，&nbsp; 您&nbsp; 必&nbsp; 须&nbsp; 把&nbsp; 其&nbsp; 它&nbsp; 的&nbsp; WM_SYSCOMMAND&nbsp; 消&nbsp; 息&nbsp; 发&nbsp; 送&nbsp; 给 <br>DefWindowProc。如果您不这样做，那么实际上是禁用了系统菜单上的所有正常选项。
<img src ="http://www.cppblog.com/saiksy/aggbug/126538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/saiksy/" target="_blank">saiksy</a> 2010-09-13 23:09 <a href="http://www.cppblog.com/saiksy/archive/2010/09/13/126538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>