﻿<?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>博客园-摄像头游戏引擎开发</title><link>http://www.cnblogs.com/deeplymove/</link><description>CME develope</description><language>zh-cn</language><lastBuildDate>Sun, 23 Nov 2008 13:44:22 GMT</lastBuildDate><pubDate>Sun, 23 Nov 2008 13:44:22 GMT</pubDate><ttl>60</ttl><item><title>摄像头游戏引擎测试程序下载</title><link>http://www.cnblogs.com/deeplymove/archive/2006/11/26/573155.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Sun, 26 Nov 2006 11:20:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2006/11/26/573155.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/573155.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2006/11/26/573155.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/573155.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/573155.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>请访问： <a href="http://blog.csdn.net/deeplymove">http://blog.csdn.net/deeplymove</a><br>以后的发布均转移至上面链接处</font></span></p>
<p _fckxhtmljob="5">&nbsp;</p>
<img src ="http://www.cnblogs.com/deeplymove/aggbug/573155.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43630/" target="_blank">[新闻]Silverlight 2 SDK中文版发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>我的博客 http://blog.csdn.net/deeplymove/</title><link>http://www.cnblogs.com/deeplymove/archive/2006/11/19/565109.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Sun, 19 Nov 2006 05:48:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2006/11/19/565109.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/565109.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2006/11/19/565109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/565109.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/565109.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/deeplymove/">http://blog.csdn.net/deeplymove/</a>&nbsp; 欢迎大家访问。
<img src ="http://www.cnblogs.com/deeplymove/aggbug/565109.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43629/" target="_blank">[新闻][译稿]微软将 jQuery IntelliSense整合到Visual Studio</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>发布一个图像处理库</title><link>http://www.cnblogs.com/deeplymove/archive/2006/11/17/564117.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Fri, 17 Nov 2006 14:52:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2006/11/17/564117.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/564117.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2006/11/17/564117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/564117.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/564117.html</trackback:ping><description><![CDATA[大家可以到<a href="https://sourceforge.net/projects/ipa-lib/">https://sourceforge.net/projects/ipa-lib/</a>&nbsp;去下载。后面会陆续发布包括摄像头引擎的代码。
<img src ="http://www.cnblogs.com/deeplymove/aggbug/564117.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43628/" target="_blank">[新闻]微软：不裁员也不削减研发开支</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>推荐一个文件传输工具</title><link>http://www.cnblogs.com/deeplymove/archive/2006/06/09/421688.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Fri, 09 Jun 2006 07:15:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2006/06/09/421688.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/421688.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2006/06/09/421688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/421688.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/421688.html</trackback:ping><description><![CDATA[<a href="http://www.brschina.com/">www.brschina.com</a>&nbsp; <br><br>非常好用，速度比msn，qq都快！而且也能用来聊天，没有广告，软件很轻，比较干净
<img src ="http://www.cnblogs.com/deeplymove/aggbug/421688.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43625/" target="_blank">[新闻]2008年11月22日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>一种Windows下线程同步的实现方法（很久以前未发表的文章，就当是消遣吧）</title><link>http://www.cnblogs.com/deeplymove/archive/2006/04/15/376156.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Sat, 15 Apr 2006 13:40:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2006/04/15/376156.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/376156.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2006/04/15/376156.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/376156.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/376156.html</trackback:ping><description><![CDATA[&nbsp;
<h1 align=center><span>一种</span><span>Windows</span><span>下线程同步的实现方法</span></h1>
<h2><span>Windows</span><span>下的多线程与线程同步概述</span></h2>
<p><span>多任务是一个操作系统可以同时运行多个程序的能力。基本上，操作系统使用一个硬件时钟为同时运行的每个进程分配&#8220;时间片&#8221;。如果时间片足够小，并且机器也没有由于太多的程序而超负荷，那么在用户看来，所有的这些程序似乎在同试运行着。</span></p>
<p><span>多线程是在一个程序内部实现多任务的能力。程序可以把它自己分隔为单独的执行&#8220;线程&#8221;，这些线程似乎也同时在运行</span><sup><span>[1]</span></sup><a><span>。</span></a><span><span><a language=JavaScript id=_anchor_1 onmouseover="msoCommentShow('_anchor_1','_com_1')" onmouseout="msoCommentHide('_com_1')" href="#_msocom_1" name=_msoanchor_1>[g1]</a><span>&nbsp;</span></span></span><span>多线程的应用非常广泛，最常见的是在需要进行大量计算的程序中使用辅助线程完成计算工作，而用户界面线程响应用户的操作。</span></p>
<p><span>多线程中不同线程之间的通讯通常是使用共享数据对象来实现的，不管是使用全局变量还是线程过程函数的指针参数进行通讯，都可能引发访问冲突</span><sup><span>[2]</span></sup><a><span>。</span></a><span><span><a language=JavaScript id=_anchor_2 onmouseover="msoCommentShow('_anchor_2','_com_2')" onmouseout="msoCommentHide('_com_2')" href="#_msocom_2" name=_msoanchor_2>[g2]</a><span>&nbsp;</span></span></span><span>而解决这一问题的方法即线程同步。</span></p>
<p><span>Windows</span><span>提供了多种方法来实现线程之间的协调和同步，有临界区、事件对象、互斥量等。这些方法都有各自的特点和适用的场合，下面就让我们看一下经典之作</span><span>《</span><span>Windows</span><span>程序设计》一书中所介绍的<span>使用临界区进行线程同步的方法</span></span><sup><span> [3]</span></sup><span>。</span></p>
<p><span>首先需要定义一个全局的临界区对象，以便在不同的线程中能够访问。例如：</span><span>CRITICAL_SECTION cs;</span></p>
<p><span>然后在某个线程中初始化这个临界区对象：</span></p>
<p><span>InitializeCriticalSection(&amp;cs);</span></p>
<p><span>这样就创建了一个名为</span><span>cs</span><span>的临界区对象。此时，线程可以通过下面的调用进入临界区：</span></p>
<p><span>EnterCriticalSection(&amp;cs);</span></p>
<p><span>在这时，线程被认为&#8220;拥有&#8221;临界区对象。没有两个线程可以同时拥有临界区对象，因此，如果一个线程进入了临界区，那么下一个使用同一临界区对象调用</span><span>EnterCriticalSection</span><span>的线程将在函数调用中被挂起。只有当第一个线程通过下面的调用离开临界区时，函数才会返回：</span></p>
<p><span>LeaveCriticalSection(&amp;cs);</span></p>
<p><span>这时，在</span><span>EnterCriticalSection</span><span>的调用中被挂起的线程拥有临界区，其函数调用也返回，允许线程继续运行。</span></p>
<p><span>当临界区不再需要时，可以调用：</span></p>
<p><span>DeleteCriticalSection(&amp;cs);</span></p>
<p><span>将其删除<a>。</a></span><span><span><a language=JavaScript id=_anchor_3 onmouseover="msoCommentShow('_anchor_3','_com_3')" onmouseout="msoCommentHide('_com_3')" href="#_msocom_3" name=_msoanchor_3>[g3]</a><span>&nbsp;</span></span></span></p>
<p><span>在进入临界区后，线程可以独占方式访问资源而不用担心其他线程的干扰，当不同的线程共享不同的数据时，还可以通过使用多个临界区来实现。</span></p>
<p><span>事件对象和互斥量等在使用上与临界区有所不同，但流程和步骤相似，只不过需要调用</span><span>WaitForSingleObject</span><span>来替代</span><span>EnterCriticalSection</span><span>函数来阻塞线程，并等待其他线程在执行完毕后释放资源。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>可以看出，线程同步是一件比较复杂而又容易出错的工作，既要保证各线程在访问和更新数据中不会冲突，又要防止死锁。在</span><span>MFC</span><span>中，为了降低线程同步的复杂性，减少工作量，提供了</span><span>CCriticalSection</span><span>、</span><span>CEvent</span><span>、</span><span>CMutex</span><span>等类封装了</span><span>Windows API</span><span>中相关的线程同步函数，方便编程人员使用</span><sup><span>[4]</span></sup><a><span>。</span></a><span><span><a language=JavaScript id=_anchor_4 onmouseover="msoCommentShow('_anchor_4','_com_4')" onmouseout="msoCommentHide('_com_4')" href="#_msocom_4" name=_msoanchor_4>[g4]</a><span>&nbsp;</span></span></span><span>但是这些类的出现并没有改变基本的线程同步编程的流程和步骤，在具体使用过程中仍需要小心谨慎的使用才能够达到目的。</span></p>
<p>&nbsp;</p>
<h2><span>一种简便的线程同步的实现方法</span></h2>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>能否在</span><span>Windows</span><span>提供的线程同步的方法上进行改进，提供一种简单方便的实现方法呢，这种方法应该不需要繁琐的步骤，既能够满足我们的要求，同时又足够的灵活。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>首先让我们重新审视一下</span><span>Windows</span><span>所提供的几种线程同步机制。可以发现，在事件对象、互斥量和信号量的使用中都可以使用一个字符串作为线程同步对象的标识，当创建一个带有名称标识的线程同步对象时，若已存在同名对象则会返回一个已存在对象的句柄，并且可以通过调用</span><span>GetLastError</span><span>获得</span><span>ERROR_ALREADY_EXISTS</span><span>值来检验是否返回了一个已存在对象的句柄值。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>以互斥量举例来说：</span><span> </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span>创建第一个互斥量</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE mutex1;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mutex1 = CreateMutex(NULL, TRUE, "mutex");</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(ERROR_ALREADY_EXISTS == GetLastError())<span>&nbsp;&nbsp; </span>//</span><span>存在同名互斥量</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("Mutex exist!\n");</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else //</span><span>未发现同名互斥量</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("Create mutex!\n");</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span>创建第二个互斥量</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE mutex2;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mutex2 = CreateMutex(NULL, TRUE, "mutex");</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(ERROR_ALREADY_EXISTS == GetLastError())<span>&nbsp;&nbsp; </span>//</span><span>存在同名互斥量</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("Mutex exist!\n");</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else //</span><span>未发现同名互斥量</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("Create mutex!\n");</span></p>
<p><span>}</span></p>
<p><span>我们在</span><span>VC++6.0</span><span>中编译并运行上述代码，得到的结果输出为：</span></p>
<p><span>Create mutex!</span></p>
<p><span>Mutex exist!</span></p>
<p><span>从而可以看出，当我们使用&#8220;</span><span>mutex</span><span>&#8221;作为名称多次创建互斥量时，通过检查</span><span>GetLastError</span><span>的返回值可判断出是否是第一次创建此名称的互斥量。由此便可进一步发展出下面两个函数：</span></p>
<p align=left><span>HANDLE Lock(char* name)</span></p>
<p align=left><span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE mutex;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Try to open an exist mutex firstly.</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, name);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(NULL == mutex)<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>// If the mutex does not exist, create it with the certain name.</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mutex = CreateMutex(NULL, TRUE, name);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else // If the mutex already exist, wait for other thread release it.</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>WaitForSingleObject(mutex, INFINITE);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return mutex;</span></p>
<p align=left><span>}</span></p>
<p align=left><span>bool Unlock(HANDLE mutex)</span></p>
<p align=left><span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(0 == ReleaseMutex(mutex))<span>&nbsp;&nbsp; </span>// Failed to release mutex</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return false;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else<span> </span>// Successed in release mutex</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CloseHandle(mutex);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mutex = NULL;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return true;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span>}</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>使用时仅需进行如下调用：</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE mutex = Lock("MutexLockName");</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&#8230;&#8230;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Unlock(mutex);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在调用</span><span>Lock</span><span>时传入互斥量的名称。当不存在同名的互斥量时调用</span><span>CreateMutex</span><span>创建一个以</span><span>name</span><span>变量值为名称的互斥量；若同名的互斥量已经存在时</span><span>OpenMutex</span><span>函数将返回已存在的互斥量的一个句柄，此时通过调用</span><span>WaitForSingleObject</span><span>阻塞当前线程，等待同名互斥量被释放后继续运行。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在调用</span><span>Unlock</span><span>时传入互斥量的句柄，通过</span><span>ReleaseMutex</span><span>释放线程对互斥量的拥有权，并关闭句柄，防止资源泄露。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>有了上述两个函数，我们便可通过对同一资源使用相同的名称来进行锁定，实现线程同步了。例如在不同的线程中存在着一个对象，定义如下：</span></p>
<p><span>CObject object;</span></p>
<p><span>当我们在访问和更改这一对象时只需进行如下调用：</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE mutex = Lock("object");</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>object.DoSomeThing();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Unlock(mutex);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>就可以十分方便的完成针对这一对象的线程同步了。</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>通过</span><span>Lock</span><span>和</span><span>Unlock</span><span>函数，我们隐藏了使用互斥量时的一些具体细节，降低了复杂性，但是对于这种方法仍存在着许多不足，下面就一步一步循序渐进的来改进这些问题。</span></p>
<p>&nbsp;</p>
<p><span>在使用过程中，必须为</span><span>Lock</span><span>函数传入一个名称作为参数，并且此名称在锁定同一数据对象时必须是一致的才能保证</span><span>Lock</span><span>函数的正常运作，这就为用户带来了不必要的麻烦。当存在如下声明时：</span></p>
<p><span>CObject* pObject1 = new CObject;</span></p>
<p><span>CObject* pObject2 = pObject1;</span></p>
<p><span>CObject* pObject3 = pObject2;</span></p>
<p><span>可以看出，</span><span>pObject1</span><span>、</span><span>pObject2</span><span>、</span><span>pObject3</span><span>实际上指向同一对象，这时候如果要进行线程同步必须在锁定这三个指针时使用相同的名称标识。于是就出现了别名问题。</span><span> </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在</span><span>C++</span><span>中，在不同的作用域中变量名称是可以相同的，因此同样一个</span><span>pObject</span><span>在不同的作用域中可能是指向不同的对象的，也就是同名问题。</span></p>
<p><span>针对别名和同名，如何能够简单的识别出同一对象并且为其统一命名呢？在</span><span>C++ </span><span>中每个类都存在一个</span><span>this</span><span>指针用以指向自身存储的地址。在一个程序中，每个不同的对象在内存中都有着不同的存储地址。这个地址就好像身份证号码一样标识出了不同的对象，也正是我们所希望得到的针对不同对象的唯一的名称。于是可以将</span><span>Lock</span><span>函数改造为：</span></p>
<p align=left><span>HANDLE Lock(void* pointer)</span></p>
<p align=left><span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>char name[128];</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>itoa((DWORD)pointer, name, 16);</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>// </span><span>以下同前述</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE mutex;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Try to open an exist mutex firstly.</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, name);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&#8230;&#8230;</span></p>
<p><span>}</span></p>
<p><span>这样在调用时就不需要再人为的为每个对象命名了，只需要将对象的地址传入即可：</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE mutex = Lock(pObject);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&#8230;&#8230;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Unlock(mutex);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>从而也就免去了命名之苦。</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>最主要的问题已经通过努力一步步地解决了，但是在程序看起来却依然很丑陋，</span><span>Lock</span><span>和</span><span>Unlock</span><span>必须作为全局函数，有违面向对象的设计原则，而且每次需要成对的调用，难免会有粗心的程序员调用了</span><a><span>Lock</span></a><span><span><a language=JavaScript id=_anchor_5 onmouseover="msoCommentShow('_anchor_5','_com_5')" onmouseout="msoCommentHide('_com_5')" href="#_msocom_5" name=_msoanchor_5>[g5]</a><span>&nbsp;</span></span></span><span>却忘记</span><span>Unlock</span><span>，于是程序就有可能进入<a>死锁</a></span><span><span><a language=JavaScript id=_anchor_6 onmouseover="msoCommentShow('_anchor_6','_com_6')" onmouseout="msoCommentHide('_com_6')" href="#_msocom_6" name=_msoanchor_6>[MS6]</a>&nbsp;</span></span><span>。</span></p>
<p><span>为了能够更方便的使用，首先创建一个类</span><span>CMutexLock</span><span>，将</span><span>Lock</span><span>和</span><span>Unlock</span><span>作为成员函数，再重新审视前面的程序，不难发现</span><span>Unlock</span><span>的参数</span><span>HANDLE mutex</span><span>也可以移入</span><span>CMutexLock</span><span>成为其成员变量：</span></p>
<p align=left><span>class CMutexLock&nbsp;</span></p>
<p align=left><span>{</span></p>
<p align=left><span>public:</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CMutexLock();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual ~CMutexLock();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>bool Lock(void* pointer);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>bool Unlock();</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>private:</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE m_Mutex;</span></p>
<p><span>};</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>这时，在使用过程中只需先声明一个</span><span>CMutexLock</span><span>的对象，然后调用</span><span>Lock</span><span>和</span><span>Unlock</span><span>函数。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>当</span><span>Lock</span><span>和</span><span>Unlock</span><span>成为一个类的成员函数时，随之而来的一个疑问就是：</span></p>
<p><span>&#8220;有必要暴露这两个函数成为公共方法吗？&#8221;既然</span><span>Lock</span><span>和</span><span>Unlock</span><span>必须成对的出现，那么不是刚好对应于类的构造函数和析构函数吗？为什么不把它们一个放入构造函数，一个放入析构函数呢？当提出了这些疑问的同时也就找到了解决之道：</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>class CMutexLock&nbsp;</span></p>
<p align=left><span>{</span></p>
<p align=left><span>public:</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CMutexLock(void* pointer);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual ~CMutexLock();</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>private:</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>bool Lock(void* pointer);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>bool Unlock();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE m_Mutex;</span></p>
<p><span>};</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p align=left><span>CMutexLock::CMutexLock(void* pointer)</span></p>
<p align=left><span>:m_Mutex(NULL)</span></p>
<p align=left><span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this-&gt;Lock(pointer);</span></p>
<p align=left><span>}</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>CMutexLock::~CMutexLock()</span></p>
<p align=left><span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this-&gt;Unlock();</span></p>
<p><span>}</span></p>
<p>&nbsp;</p>
<p><span>&#8230;&#8230;</span></p>
<p><span>对</span><span>CMutexLock</span><span>的调用也简化为了一句定义语句：</span></p>
<p><span>{</span></p>
<p><span>CMutexLock lock(pObject);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&#8230;&#8230;</span></p>
<p><span>}</span></p>
<p><span>当声明</span><span>lock</span><span>时，针对传入构造函数的</span><span>pObject</span><span>调用</span><span>Lock</span><span>函数，当</span><span>lock</span><span>离开生存空间销毁时在析构函数里面调用</span><span>Unlock</span><span>释放互斥量。在这里通过使用</span><span>{}</span><span>来控制</span><span>CMutexLock</span><span>析构函数的调用，即释放对</span><span>pObject</span><span>的锁定。在</span><span>C++</span><span>中</span><span>{}</span><span>可以用来控制变量的作用域。在</span><span>{}</span><span>内声明的</span><span>lock</span><span>在遇到</span><span>}</span><span>时即会被销毁，在销毁前析构函数也将会被自动调用。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>至此，我们就完成了一个使用起来简单方便的线程同步辅助类。</span></p>
<h3><span>小结</span></h3>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在本文中，以</span><span>Windows</span><span>多线程机制为基础，利用</span><span>C++</span><span>的一些最基本的特性一步步的创建出了</span><span>CMutexLock</span><span>类，而线程同步也由最初繁琐复杂的过程简化至只需一对</span><span>{}</span><span>和一句定义语句就完成了。</span><span>CMutexLock</span><span>使用起来简单方便，可以针对不同的数据对象分别进行锁定，并且减少了死锁的出现。在实际程序中运作良好，表明了这种方法的实用性。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>但是在使用过程中，由于互斥量本身特性和本文中实现方式带来的一些弊病在所难免，例如不同进程之间的名字冲突、效率问题、构造函数发生错误、别名问题等。限于篇幅和笔者水平，这些问题不在此文中一一详述。如有兴趣，可来信讨论，邮件地址：</span><span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#101;&#112;&#108;&#121;&#109;&#111;&#118;&#101;&#64;&#116;&#111;&#109;&#46;&#99;&#111;&#109;">deeplymove@tom.com</a> </span><span>。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span>参考文献：</span></p>
<p><span>[1] P1119 </span><span>《</span><span>Windows</span><span>程序设计》（第</span><span>5</span><span>版）</span><span> Charles Petzold </span><span>北京大学出版社</span><span><span><br></span></span><span>[2] P263 </span><span>《</span><span>Visual C++ 6.0 </span><span>技术内幕》（第</span><span>5</span><span>版修订版）</span><span> David J.Kruglinski Scot Wingo George Shepherd </span><span>希望出版社</span></p>
<p><span>[3] P1147 </span><span>《</span><span>Windows</span><span>程序设计》（第</span><span>5</span><span>版）</span><span> Charles Petzold </span><span>北京大学出版社</span></p>
<p><span>[4] MSDN </span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div>
<hr align=left width="33%" SIZE=1>
<div>
<div language=JavaScript id=_com_1 onmouseover="msoCommentShow('_anchor_1','_com_1')" onmouseout="msoCommentHide('_com_1')"><span><a name=_msocom_1></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_1">[g1]</a></span></span></span><span>P1119 </span><span>《</span><span>Windows</span><span>程序设计》（第</span><span>5</span><span>版）</span><span> Charles Petzold </span><span>北京大学出版社</span></p>
</div>
</div>
<div>
<div language=JavaScript id=_com_2 onmouseover="msoCommentShow('_anchor_2','_com_2')" onmouseout="msoCommentHide('_com_2')"><span><a name=_msocom_2></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_2">[g2]</a></span></span></span><span>P263 </span><span>《</span><span>Visual C++ 6.0 </span><span>技术内幕》（第</span><span>5</span><span>版修订版）</span><span> David J.Kruglinski Scot Wingo George Shepherd </span><span>希望出版社</span></p>
<p>&nbsp;</p>
</div>
</div>
<div>
<div language=JavaScript id=_com_3 onmouseover="msoCommentShow('_anchor_3','_com_3')" onmouseout="msoCommentHide('_com_3')"><span><a name=_msocom_3></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_3">[g3]</a></span></span></span><span>P1147 </span><span>《</span><span>Windows</span><span>程序设计》（第</span><span>5</span><span>版）</span><span> Charles Petzold </span><span>北京大学出版社</span></p>
</div>
</div>
<div>
<div language=JavaScript id=_com_4 onmouseover="msoCommentShow('_anchor_4','_com_4')" onmouseout="msoCommentHide('_com_4')"><span><a name=_msocom_4></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_4">[g4]</a></span></span></span><span>MSDN</span></p>
</div>
</div>
<div>
<div language=JavaScript id=_com_5 onmouseover="msoCommentShow('_anchor_5','_com_5')" onmouseout="msoCommentHide('_com_5')"><span><a name=_msocom_5></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_5">[g5]</a></span></span></span></p>
</div>
</div>
<div>
<div language=JavaScript id=_com_6 onmouseover="msoCommentShow('_anchor_6','_com_6')" onmouseout="msoCommentHide('_com_6')"><span><a name=_msocom_6></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_6">[MS6]</a></span></span></span><span>重构<br></span></p>
</div>
</div>
</div>
<img src ="http://www.cnblogs.com/deeplymove/aggbug/376156.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43624/" target="_blank">[新闻]诺基亚将支持Lotus Notes 和黑莓争夺市场</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>源代码下载</title><link>http://www.cnblogs.com/deeplymove/archive/2005/11/30/287575.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Wed, 30 Nov 2005 02:32:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2005/11/30/287575.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/287575.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2005/11/30/287575.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/287575.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/287575.html</trackback:ping><description><![CDATA[源代码较大，我放在<A href="http://www.cnblogs.com/Files/deeplymove/CameraGameSDK_Source.rar,大家自己下载吧" target=_new><FONT color=#525252>http://www.cnblogs.com/Files/deeplymove/CameraGameSDK_Source.rar,大家自己下载吧</FONT></A>. <BR>有问题可以发邮件问我.不过最近比较忙,可能不会很快的回复. :) <img src ="http://www.cnblogs.com/deeplymove/aggbug/287575.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43623/" target="_blank">[新闻]Mozilla公布去年收入报告</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>准备把引擎开源</title><link>http://www.cnblogs.com/deeplymove/archive/2005/08/16/216174.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Tue, 16 Aug 2005 08:55:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2005/08/16/216174.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/216174.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2005/08/16/216174.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/216174.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/216174.html</trackback:ping><description><![CDATA[还没想好，不知道有多少人感兴趣<img src ="http://www.cnblogs.com/deeplymove/aggbug/216174.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43621/" target="_blank">[新闻]2008年11月21日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>好久没更新了</title><link>http://www.cnblogs.com/deeplymove/archive/2005/07/06/187219.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Wed, 06 Jul 2005 07:20:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2005/07/06/187219.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/187219.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2005/07/06/187219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/187219.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/187219.html</trackback:ping><description><![CDATA[这周要做课题进展报告，忙着做ppt和查资料，没时间更新啦<IMG src="http://www.cnblogs.com/Emoticons/emsad.gif" align=absMiddle border=0><BR>下周要是有时间的话，争取做点工作了。<img src ="http://www.cnblogs.com/deeplymove/aggbug/187219.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43620/" target="_blank">[新闻]Google拟年底前关闭"lively" 因不敌"第二人生"</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>大家给提提意见吧</title><link>http://www.cnblogs.com/deeplymove/archive/2005/07/01/184359.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Fri, 01 Jul 2005 01:46:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2005/07/01/184359.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/184359.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2005/07/01/184359.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/184359.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/184359.html</trackback:ping><description><![CDATA[下一步如何做？做好一个demo还是继续升级引擎？<IMG src="http://www.cnblogs.com/Emoticons/hitwall.gif" align=absMiddle border=0><img src ="http://www.cnblogs.com/deeplymove/aggbug/184359.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43619/" target="_blank">[新闻]微软证实已雇佣前雅虎搜索官员Suchter</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>bug report(感谢Yahle)</title><link>http://www.cnblogs.com/deeplymove/archive/2005/06/23/179891.html</link><dc:creator>deeplymove</dc:creator><author>deeplymove</author><pubDate>Thu, 23 Jun 2005 11:47:00 GMT</pubDate><guid>http://www.cnblogs.com/deeplymove/archive/2005/06/23/179891.html</guid><wfw:comment>http://www.cnblogs.com/deeplymove/comments/179891.html</wfw:comment><comments>http://www.cnblogs.com/deeplymove/archive/2005/06/23/179891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/deeplymove/comments/commentRss/179891.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/deeplymove/services/trackbacks/179891.html</trackback:ping><description><![CDATA[感谢Yahle在测试中发现的问题。因为上传的是debug版本的CMECom.dll，造成在某些没有安装vc6.0的系统上无法正常注册控件，这是我的疏忽。我重新编译了组件，请大家重新下载修正后的sdk。<BR>另外，在vs2003下，由于一些库文件的不兼容，主要是stl的库问题，造成demo无法编译，我会在近期解决，不过目前一两周内可能没时间完成兼容版本了。请大家原谅。<img src ="http://www.cnblogs.com/deeplymove/aggbug/179891.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43615/" target="_blank">[新闻]百度称不会放弃“竞价排名” 两名曝光员工被辞</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>