﻿<?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++博客-kenlistian-随笔分类-cpp</title><link>http://www.cppblog.com/kenlistian/category/1841.html</link><description>厚积薄发.
勤为桨,思为帆



</description><language>zh-cn</language><lastBuildDate>Tue, 24 Mar 2009 16:14:54 GMT</lastBuildDate><pubDate>Tue, 24 Mar 2009 16:14:54 GMT</pubDate><ttl>60</ttl><item><title>发送消息给线程</title><link>http://www.cppblog.com/kenlistian/archive/2009/03/22/77479.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Sun, 22 Mar 2009 05:06:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2009/03/22/77479.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/77479.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2009/03/22/77479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/77479.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/77479.html</trackback:ping><description><![CDATA[


采用PostThreadMessage即可<div>BOOL&#160;PostThreadMessage(<br>&#160;&#160;DWORD&#160;<em>idThread</em>, &#160; &#160; //线程ID,通过创建线程后的id<br>&#160;&#160;UINT &#160;<em>Msg</em>, &#160; &#160; &#160; &#160; &#160; //消息id<br>&#160;&#160;WPARAM&#160;<em>wParam</em>, &#160; &#160;<br>&#160;&#160;LPARAM&#160;<em>lParam</em>);</div><div>然后在线程通过GetMessage or PeekMessage去获取该消息.<br><br>代码片段如下:</div><div><div>unsigned int CALLBACK thread_func(LPVOID lp)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>while(1)</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>{</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>MSG msg;<span class="Apple-tab-span" style="white-space:pre">		</span></div><div><span class="Apple-tab-span" style="white-space:pre">		</span>while (GetMessage(&amp;msg, NULL, &#160;0, 0))&#160;</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>//while (PeekMessage(&amp;msg, NULL, &#160;0, 0,PM_REMOVE))&#160;</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>{&#160;</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>switch(msg.message)&#160;</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>{&#160;</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>case WM_MYMESSAGE: <span class="Apple-tab-span" style="white-space:pre">											</span></div><div><span class="Apple-tab-span" style="white-space:pre">					</span>printf("\n *thread_func1:%d", msg.wParam);</div><div><span class="Apple-tab-span" style="white-space:pre">					</span>break;<span class="Apple-tab-span" style="white-space:pre">							</span></div><div><span class="Apple-tab-span" style="white-space:pre">			</span>}<span class="Apple-tab-span" style="white-space:pre">			</span></div><div>&#160;&#160; &#160; &#160; &#160;}&#160;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>}&#160;</div><div>}</div></div><div><br></div><div>其中发送线程片段如下:</div><div><div><span class="Apple-tab-span" style="white-space:pre">	</span>UINT dwId</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>_beginthreadex(NULL, 0, thread_func, NULL, 0, &amp;dwId);</div><div>&#160;&#160; &#160; &#160; &#160;...</div><div><br></div><div><br></div><div><br></div><div>附:</div><div><div>GetMessage(LPMSG lpMsg, &#160;HWND hWnd, &#160; UINT wMsgFilterMin, &#160; UINT wMsgFilterMax)</div><div>PeekMessage(LPMSG lpMsg, &#160;HWND hWnd, &#160; UINT wMsgFilterMin, &#160; UINT wMsgFilterMax,UINT wRemoveMsg)<br></div><div><br></div><div>&#160;&#160; &#160;参数wRemoveMsg的作用是指定消息获取的方式，如果设为PM_NOREMOVE,那么消息将不会从消息队列中被移出，如果设为PM_REMOVE，那么消息将会从消息队列中被移出；</div><div><br></div><div>&#160;&#160; &#160;两个函数主要有以下两个区别:&#160;</div><div>&#160;&#160; &#160;1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。(GetMessage 处于挂起等待消息来,而PeekMessage则不管有不有消息都返回)</div><div>&#160;&#160; &#160;2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。(如果保留在队列中,最好立即处理)</div><div><br></div><div>&#160;&#160; &#160; &#160;在Windows的内部，GetMessage和PeekMessage执行着相同的代码。而两者最大的不同之处则体现在没有任何消息返回到应用程序的情况下。在此种情况下，PeekMessage会返回一个空值到应用程序，GetMessage会在此时让应用程序休眠。</div><div>(如果在线程中使用,用GetMessage or PeekMessage都无所谓,不需要考虑消息队列的remove,消息队列在各个线程中不过是个拷贝?而已.)</div><div><br></div><div><br></div><div>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1573835</div></div></div><img src ="http://www.cppblog.com/kenlistian/aggbug/77479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2009-03-22 13:06 <a href="http://www.cppblog.com/kenlistian/archive/2009/03/22/77479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>waitformultipleobjects点滴</title><link>http://www.cppblog.com/kenlistian/archive/2009/03/17/76890.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 17 Mar 2009 10:50:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2009/03/17/76890.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/76890.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2009/03/17/76890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/76890.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/76890.html</trackback:ping><description><![CDATA[&nbsp; 该函数等待handle信号发来,它的好处在于可以等待多个信号发来.<br>原型：<br>DWORD WaitForMultipleObjects(<br>&nbsp;DWORD nCount,<br>&nbsp;const HANDLE* lpHandles,<br>&nbsp;BOOL bWaitAll,<br>&nbsp;DWORD dwMilliseconds<br>);<br><br>&nbsp;第一个参数表示信号数目.<br>当设置bWaitAll = True,表示必须其信号必须都达到nCount才可以下一步.而不是lpHandle数组的信号都到.<br>&nbsp;&nbsp;&nbsp; 同时,如果lpHandle的某个信号SetEvent多次,是不会累计到nCount中,也就是说,当多个线程在处理完以后,可以在各自的线程体必须调用不同的event句柄来发信号,它才会被累计达到nCount后解锁进入下一步. 
<img src ="http://www.cppblog.com/kenlistian/aggbug/76890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2009-03-17 18:50 <a href="http://www.cppblog.com/kenlistian/archive/2009/03/17/76890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于link2001错误</title><link>http://www.cppblog.com/kenlistian/archive/2008/11/14/66872.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Thu, 13 Nov 2008 17:26:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/11/14/66872.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/66872.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/11/14/66872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/66872.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/66872.html</trackback:ping><description><![CDATA[<div><br>经常在链接是报link2001错误，其中一般是函数体没有定义错误。但是排除以上简单的外，还有一种如下无法解析系统文件中的函数定义。如下：<br><br>LINK : warning LNK4098: 默认库&#8220;LIBCMT&#8221;与其他库的使用冲突；请使用 /NODEFAULTLIB:library<br>libcpmtd.lib(cerr.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW<br>libcpmtd.lib(stdthrow.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW<br>。。。。。。<br>libcpmtd.lib(_tolower.obj) : error LNK2019: 无法解析的外部符号 __calloc_dbg，该符号在函数 __Getctype 中被引用<br><br>像这种情况，可以推测运用了错误的运行库包。<br><br>在一程序中使用不同类型的运行时库或使用调试和非调试版本的运行时库，则将收到此链接错误。<br><br>例如，编译一个文件以使用一种运行时库，而编译另一个文件以使用另一种运行时库（例如单线程运行时库对多线程运行时库），试图链接它们，则将得到此警告。应将所有源文件编译为使用同一运行时库。<br><br>其实就是调正编译器选项参数：/MD、/MT &nbsp; 和 &nbsp; /LD<br><br>在vc8中，在&#8220;配置属性--&gt;C/C++--&gt;代码生成--&gt;运行时库&#8221;中将&#8220;多线程（/MT）&#8221;统一改为&#8220;多线程调试（/MTd）&#8221;即可。<br><br><br><br></div>
<img src ="http://www.cppblog.com/kenlistian/aggbug/66872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-11-14 01:26 <a href="http://www.cppblog.com/kenlistian/archive/2008/11/14/66872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汇总函数指针理解</title><link>http://www.cppblog.com/kenlistian/archive/2008/10/29/65485.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Wed, 29 Oct 2008 14:23:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/10/29/65485.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/65485.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/10/29/65485.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/65485.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/65485.html</trackback:ping><description><![CDATA[<br>一个函数指针的理解：<br>　有一段程序存储在起始地址为 0的一段内存上，如果我们想要调用这段程序，请问该如何去做？<br>　答案是 (*(void (*)( ) )0)( )。<br><br>　首先，最基本的函数声明： void function (paramList);<br>　最基本的函数调用： function(paramList);<br><br>　　鉴于问题中的函数没有参数，函数调用可简化为 function();<br>&nbsp;　 根据问题描述，可以知道 0是这个函数的入口地址，也就是说，0是一个函数的指针。<br>&nbsp;&nbsp; 使用函数指针的函数声明形式是：void (*pFunction)()，相应的调用形式是： (*pFunction)()，<br>&nbsp;&nbsp; 则问题中的函数调用可以写作：(*0)( )。<br><br>　　大家知道，函数指针变量不能是一个常数，因此上式中的 0必须要被转化为函数指针。<br><br>　　我们先来研究一下，对于使用函数指针的函数：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如 void (*pFunction)( )，函数指针变量的原型是什么？<br>&nbsp;&nbsp;&nbsp; 这个问题很简单，pFunction函数指针原型是( void (*)( ) )，即去掉变量名，<br>&nbsp;&nbsp;&nbsp; 清晰起见，整个加上（）号。<br><br>　　所以将 0强制转换为一个返回值为void，参数为空的函数指针如下：( void (*)( ) )。<br><br>　　 OK，结合2)和3)的分析，结果出来了，那就是：(*(void (*)( ) )0)( ) 。<br><br>　　答案分析：从头到尾理解答案<br><br>　　 (void (*)( )) ，是一个返回值为void，参数为空的函数指针原型。<br>　　 (void (*)( ))0，把0转变成一个返回值为void，参数为空的函数指针，指针指向的地址为0.<br>　　 *(void (*)( ))0，前面加上*表示整个是一个返回值为void的函数的名字<br>　　 (*(void (*)( ))0)( )，这当然就是一个函数了。<br><br>　　我们可以使用 typedef清晰声明如下：<br><br>　　 typedef void (*pFun)();<br><br>这样定义之后，pFun就是一个返回类型为void无参数的函数指针变量了。<br><br>　　这样函数变为 (*(pFun)0)();<br><br><br>----<br>在调用动态库时，习惯用typedef重新定义动态库函数中的函数地址（函数指针），<br>如在动态库（test.dll）中有如下函数：<br>int DoCase(int, long);<br><br>则，在调用动态库是有两种方法：<br>1. 先声明一个与动态库中类型一致的指针函数变量：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">DOCASE)(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;,</span><span style="color: #0000ff;">long</span><span style="color: #000000;">);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用于指向动态库中的DoCase函数地址</span><span style="color: #008000;"><br></span><span style="color: #000000;">HINSTANCE&nbsp;gLibMyDLL&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br>gLibMyDLL&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LoadLibrary(</span><span style="color: #000000;">"</span><span style="color: #000000;">test.dll</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(gLibMyDLL&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;NULL)<br>{<br>&nbsp;&nbsp;DOCASE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">)(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,</span><span style="color: #0000ff;">long</span><span style="color: #000000;">))GetProcAddress(gLibMyDLL,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">DoCase</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DOCASE(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1000</span><span style="color: #000000;">);<br><br></span><span style="color: #000000;">2</span><span style="color: #000000;">.用typedef定义一个指针函数：<br>typedef&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">DOCASE)(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;,</span><span style="color: #0000ff;">long</span><span style="color: #000000;">);<br><br>HINSTANCE&nbsp;gLibMyDLL&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br>DOCASE&nbsp;_docase;<br>gLibMyDLL&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LoadLibrary(</span><span style="color: #000000;">"</span><span style="color: #000000;">test.dll</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(gLibMyDLL&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;NULL)<br>{<br>&nbsp;&nbsp;_docase&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(DOCASE)GetProcAddress(gLibMyDll,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">DoCase</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;s</span><span style="color: #000000;">=</span><span style="color: #000000;">_docase(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1000</span><span style="color: #000000;">);</span></div>
<br><br>----------------<br>在C++类中使用函数指针。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">typedef&nbsp;返回类型(类名::*新类型)(参数表)</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CA<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;lcFun(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a){&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;&nbsp;}<br>};<br><br>CA&nbsp;ca;<br>typedef&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;(CA::</span><span style="color: #000000;">*</span><span style="color: #000000;">PTRFUN)(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);<br>PTRFUN&nbsp;pFun;<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;pFun&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CA::lcFun;<br>&nbsp;&nbsp;ca.(</span><span style="color: #000000;">*</span><span style="color: #000000;">pFun)(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br>}</span></div>
<br><br>指针的定义与使用都加上了&#8220;类限制&#8221;或&#8220;对象&#8221;，用来指明指针指向的函数是哪个类的,<br>这里的类对象也可以是使用new得到的。<br>如：<br>CA *pca = new CA;<br>pca-&gt;(*pFun)(2);<br>delete pca;<br>而且这个类对象指针可以是类内部成员变量，你甚至可以使用this指针。<br>如：类CA有成员变量PTRFUN m_pfun;<br>void CA::lcFun2()<br>{<br>&nbsp;&nbsp; (this-&gt;*m_pFun)(2);<br>}<br>一句话，使用类成员函数指针必须有&#8220;-&gt;*&#8221;或&#8220;.*&#8221;的调用。<br><br><br>--------------------<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;);<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;tt()<br>{<br>&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">kao,没玩过这种\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">Fun)();<br>&nbsp;&nbsp;&nbsp;&nbsp;Fun&nbsp;mytest;<br>&nbsp;&nbsp;&nbsp;&nbsp;mytest&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tt;<br>&nbsp;&nbsp;&nbsp;&nbsp;test((</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)mytest);<br>&nbsp;&nbsp;&nbsp;&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>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;p)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">)())p)();<br>}</span></div>
<br><br><img src ="http://www.cppblog.com/kenlistian/aggbug/65485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-10-29 22:23 <a href="http://www.cppblog.com/kenlistian/archive/2008/10/29/65485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>offsetof 的理解</title><link>http://www.cppblog.com/kenlistian/archive/2008/10/27/65218.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 27 Oct 2008 09:16:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/10/27/65218.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/65218.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/10/27/65218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/65218.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/65218.html</trackback:ping><description><![CDATA[<br>
<br>
关于偏移量的宏定义<br>
<br>
#define offsetof(s,m)&nbsp;&nbsp; (size_t)&amp;(((s *)0)-&gt;m)<br>
<br>
s是一个结构名，它有一个名为m的成员（s和m 是宏offsetof的形参，<br>它实际是返回结构s的成员m的偏移地址<br>
<br>
<br>
(s *)0 是骗编译器说有一个指向类（或结构）s的指针，其地址值0&nbsp; <br>
<br>
&amp;((s *)0)-&gt;m&nbsp;&nbsp; 是要取得类s中成员变量m的地址&nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; 因基址为0，这时m的地址当然就是m在s中的偏移<br><br>最后转换size_t 型，即unsigned int。<br>
<br>
有例子如：&nbsp; <br>
&nbsp; struct&nbsp;&nbsp; AAA&nbsp; <br>
&nbsp; {&nbsp; <br>
&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; i;&nbsp; <br>
&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; j;&nbsp; <br>
&nbsp; };&nbsp; <br>
&nbsp;&nbsp; <br>
&nbsp; struct&nbsp;&nbsp; AAA&nbsp;&nbsp; *pAAA;&nbsp; <br>
&nbsp; pAAA = new&nbsp;&nbsp; AAA;&nbsp; <br>
&nbsp; 这时，pAAA实际上是一个Pointer, 指向某一确定的内存地址，<br>
&nbsp;&nbsp;&nbsp;&nbsp; 如0x1234;&nbsp; <br>
&nbsp; 而pAAA-&gt;i 整体是一个int型变量，其地址是&amp;(pAAA-&gt;i),<br>
&nbsp; '&amp;'为取址运算符；&nbsp; <br>
&nbsp; 那么&amp;(pAAA-&gt;i)一定等于0x1234,因 i 是结构体AAA的第一个元素。&nbsp; <br>
&nbsp; 而&amp;(pAAA-&gt;j)一定是0x1234 + 0x4 = 0x1238; 因为sizeof(int) = 4;&nbsp; <br>
&nbsp;&nbsp; <br>
&nbsp; 这个做法的巧妙之处就是：它把&#8220;0&#8221;作为上例中的pAAA,那么&amp;(pAAA-&gt;j)就是j的&nbsp; <br>
&nbsp; offset啦，&nbsp; <br>
<br>
&nbsp; 解析结果是：&nbsp; <br>
&nbsp; (s*)0,将 0 强制转换为Pointer to "s"&nbsp;&nbsp;&nbsp; <br>
&nbsp; 可以记 pS = (s*)0，pS是指向s的指针，它的值是0;&nbsp; <br>
&nbsp; 那么pS-&gt;m就是m这个元素了，而&amp;(pS-&gt;m)就是m的地址，<br>
&nbsp; 就是offset啦&nbsp;&nbsp;&nbsp;&nbsp; <br>
<br><br>
<br>
<br> <img src ="http://www.cppblog.com/kenlistian/aggbug/65218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-10-27 17:16 <a href="http://www.cppblog.com/kenlistian/archive/2008/10/27/65218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>备注ado加头文件</title><link>http://www.cppblog.com/kenlistian/archive/2008/07/17/56385.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Thu, 17 Jul 2008 02:21:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/07/17/56385.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/56385.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/07/17/56385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/56385.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/56385.html</trackback:ping><description><![CDATA[ado在dll中使用如下的头文件<br><br>#pragma warning(disable:4146)<br>#import "C:\Program Files\Common Files\System\ADO\msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")<br>#pragma warning(default:4146)<br><br>using namespace ADODB;<br><br>"Provider=SQLOLEDB,Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;"<br><br>#import "c:\program files\common files\system\ado\msado15.dll" no_namespaces rename("EOF","adoEOF")<br><br><br>http://www.pconline.com.cn/pcedu/empolder/gj/vc/0507/653859.html<br>
<img src ="http://www.cppblog.com/kenlistian/aggbug/56385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-07-17 10:21 <a href="http://www.cppblog.com/kenlistian/archive/2008/07/17/56385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bind1nd 和bind2nd的意思</title><link>http://www.cppblog.com/kenlistian/archive/2008/07/14/56114.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 14 Jul 2008 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/07/14/56114.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/56114.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/07/14/56114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/56114.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/56114.html</trackback:ping><description><![CDATA[<br>&nbsp;采用bind1st和bind2nd的意思，就是把参数绑定在第一位还是第二位。<br>继承于binary_function 类.<br>描述如下<br>Class binder1st binds the value to the first argument of the binary function, and binder2nd does the same thing<br>for the second argument of the function. <br><br>如下：例子<br><br>struct compare_str :binary_function&lt;ST_DataResult*, char*, bool&gt;<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; bool operator()(ST_DataResult* pDataRet, char* szTypeCode) const<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return strcmp(pDataRet-&gt;sType , szTypeCode) == 0 ? true : false;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>};<br><br><br>。。。<br><br>char szTypeCode[4] = {'\0'};<br>strcpy(szTypeCode, sTypeCode);<br>pIt = find_if(m_d_ret_data.begin(), m_d_ret_data.end(),<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bind2nd(compare_str(), szTypeCode));<br><br>其中把szTypeCode变量传入到compare_str所定义的第二个参数位置传入。<br>如果写成bind1nd, 则是把szTypeCode作为第一个参数传入，那么会报错。<br>因为类型不对。<br><br><br><img src ="http://www.cppblog.com/kenlistian/aggbug/56114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-07-14 16:56 <a href="http://www.cppblog.com/kenlistian/archive/2008/07/14/56114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wxWidgets的配置</title><link>http://www.cppblog.com/kenlistian/archive/2008/06/03/52059.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 03 Jun 2008 10:13:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/06/03/52059.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/52059.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/06/03/52059.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/52059.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/52059.html</trackback:ping><description><![CDATA[&nbsp; <br>目前是wxWidgets-2.8.7，<br>下载<a href="http://sourceforge.net/project/showfiles.php?group_id=9863">http://sourceforge.net/project/showfiles.php?group_id=9863</a><br><br>其中在windows下，则选择其中msw的压缩下载。<br>按照install文档要求，编译wxWdigets中的builder目录中的wx。bsp。<br>由于该wxwdgets支持多种编译器，选择相关的工程文件加载。<br><br>传统采用vc6.<br><br>生成的编译文件在lib目录中。如果采用vc则目录为vc_lib.<br><br>生成的lib文件有(release or debug)：<br>
<pre> wxbase28.lib              wxbase28d.lib
wxbase28_net.lib          wxbase28d_net.lib
wxbase28_xml.lib          wxbase28d_xml.lib
wxmsw28_core.lib          wxmsw28d_core.lib
wxmsw28_html.lib          wxmsw28d_html.lib
wxmsw28_adv.lib           wxmsw28d_adv.lib</pre>
<pre>在vc中设置lib，可以把该目录加入，也可以直接把生成的文件丢在vc的lib目录。</pre>
<pre>关于unicode模式编辑如上。</pre>
<pre>在include设置中，需要加入wxWidgets目录中的include目录。</pre>
<pre>运行demo程序测试.<br><br>注意：在include也需要把setup.h头文件加入。该头也根据生成的lib目录中调用。<br>      不过最好加在预处理的include directory目录编辑框中。<br></pre>
<pre>&nbsp;<img  src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/moz-screenshot.jpg" alt=""></pre>
<pre>&nbsp; <br><img  src="http://www.cppblog.com/images/cppblog_com/kenlistian/221.JPG" border="0"> </pre>
<pre>&nbsp;</pre>
<pre>&nbsp;</pre><img src ="http://www.cppblog.com/kenlistian/aggbug/52059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-06-03 18:13 <a href="http://www.cppblog.com/kenlistian/archive/2008/06/03/52059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EnBase64 and DeBase64 code</title><link>http://www.cppblog.com/kenlistian/archive/2008/04/23/47892.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Wed, 23 Apr 2008 04:06:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/04/23/47892.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/47892.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/04/23/47892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/47892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/47892.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Base64 编码和解码， 说到Base64编码和解码，不过就是把3个字节进行处理后放置到4个字节空间。其原理就是：&nbsp;&nbsp;&nbsp; 待编码数据，以3个字节为单位，依次取6位数据并在前面补上两个0形成新的8位编码，由于3*8=4*6，这样3个字节的输入会变成4个字节的输出，长度上增加了1/3。&nbsp;&nbsp;&nbsp; 以上处理存在着字符不是可见字符，...&nbsp;&nbsp;<a href='http://www.cppblog.com/kenlistian/archive/2008/04/23/47892.html'>阅读全文</a><img src ="http://www.cppblog.com/kenlistian/aggbug/47892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-04-23 12:06 <a href="http://www.cppblog.com/kenlistian/archive/2008/04/23/47892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单的队列</title><link>http://www.cppblog.com/kenlistian/archive/2008/01/15/41183.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 15 Jan 2008 07:13:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/01/15/41183.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/41183.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/01/15/41183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/41183.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/41183.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000;">using&nbsp;namespace&nbsp;std;<br></span><span style="color: #008080;">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000;">class&nbsp;CYException<br></span><span style="color: #008080;">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;sMsg;<br></span><span style="color: #008080;">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nError;<br></span><span style="color: #008080;">&nbsp;10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CYException(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nErr,char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;sErrMsg){<br></span><span style="color: #008080;">&nbsp;11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nError&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nErr;<br></span><span style="color: #008080;">&nbsp;12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sMsg&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sErrMsg;<br></span><span style="color: #008080;">&nbsp;13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;~CYException(){}<br></span><span style="color: #008080;">&nbsp;15</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;16</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;17</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;18</span>&nbsp;<span style="color: #000000;">template&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">class&nbsp;&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br></span><span style="color: #008080;">&nbsp;19</span>&nbsp;<span style="color: #000000;">class&nbsp;&nbsp;&nbsp;CYQueueSyn&nbsp;<br></span><span style="color: #008080;">&nbsp;20</span>&nbsp;<span style="color: #000000;">{&nbsp;<br></span><span style="color: #008080;">&nbsp;21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:&nbsp;<br></span><span style="color: #008080;">&nbsp;22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::list</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;queue;&nbsp;<br></span><span style="color: #008080;">&nbsp;23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;m_outtime;&nbsp;<br></span><span style="color: #008080;">&nbsp;24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;m_readSem;&nbsp;<br></span><span style="color: #008080;">&nbsp;25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;m_writeSem;&nbsp;<br></span><span style="color: #008080;">&nbsp;26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;m_synObject;&nbsp;<br></span><span style="color: #008080;">&nbsp;27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:&nbsp;<br></span><span style="color: #008080;">&nbsp;28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CYQueueSyn(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;length,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;outtime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;INFINITE);&nbsp;<br></span><span style="color: #008080;">&nbsp;29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;&nbsp;&nbsp;~CYQueueSyn(void);&nbsp;<br></span><span style="color: #008080;">&nbsp;30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:&nbsp;<br></span><span style="color: #008080;">&nbsp;31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;&nbsp;&nbsp;inq(T&nbsp;type);&nbsp;<br></span><span style="color: #008080;">&nbsp;32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;&nbsp;&nbsp;outq();&nbsp;<br></span><span style="color: #008080;">&nbsp;33</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;&nbsp;&nbsp;free();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">&nbsp;35</span>&nbsp;<span style="color: #000000;">};&nbsp;<br></span><span style="color: #008080;">&nbsp;36</span>&nbsp;<span style="color: #000000;"></span><span style="color: #000000;">////////////////////////////////////////////////////////</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;37</span>&nbsp;<span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">class&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br></span><span style="color: #008080;">&nbsp;38</span>&nbsp;<span style="color: #000000;">void&nbsp;&nbsp;&nbsp;CYQueueSyn</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::free()&nbsp;<br></span><span style="color: #008080;">&nbsp;39</span>&nbsp;<span style="color: #000000;">{&nbsp;<br></span><span style="color: #008080;">&nbsp;40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)queue.size();&nbsp;<br></span><span style="color: #008080;">&nbsp;41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;<br></span><span style="color: #008080;">&nbsp;42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;queue.back();&nbsp;<br></span><span style="color: #008080;">&nbsp;43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;queue.clear();&nbsp;<br></span><span style="color: #008080;">&nbsp;44</span>&nbsp;<span style="color: #000000;">}&nbsp;<br></span><span style="color: #008080;">&nbsp;45</span>&nbsp;<span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">class&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br></span><span style="color: #008080;">&nbsp;46</span>&nbsp;<span style="color: #000000;">CYQueueSyn</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::CYQueueSyn(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;length,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;outtime)&nbsp;<br></span><span style="color: #008080;">&nbsp;47</span>&nbsp;<span style="color: #000000;">{&nbsp;<br></span><span style="color: #008080;">&nbsp;48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_readSem&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CreateSemaphore(</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,length,</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">);&nbsp;<br></span><span style="color: #008080;">&nbsp;49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_writeSem&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CreateSemaphore(</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,length,length,</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">);&nbsp;<br></span><span style="color: #008080;">&nbsp;50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_synObject&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;::CreateMutex(</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,</span><span style="color: #0000ff;">false</span><span style="color: #000000;">,</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">);&nbsp;<br></span><span style="color: #008080;">&nbsp;51</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_outtime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;outtime;<br></span><span style="color: #008080;">&nbsp;53</span>&nbsp;<span style="color: #000000;">}&nbsp;<br></span><span style="color: #008080;">&nbsp;54</span>&nbsp;<span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">class&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br></span><span style="color: #008080;">&nbsp;55</span>&nbsp;<span style="color: #000000;">CYQueueSyn</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::~CYQueueSyn()&nbsp;<br></span><span style="color: #008080;">&nbsp;56</span>&nbsp;<span style="color: #000000;">{&nbsp;<br></span><span style="color: #008080;">&nbsp;57</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(m_readSem);&nbsp;<br></span><span style="color: #008080;">&nbsp;58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(m_writeSem);&nbsp;<br></span><span style="color: #008080;">&nbsp;59</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(m_synObject);&nbsp;<br></span><span style="color: #008080;">&nbsp;60</span>&nbsp;<span style="color: #000000;">}&nbsp;<br></span><span style="color: #008080;">&nbsp;61</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;62</span>&nbsp;<span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">class&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br></span><span style="color: #008080;">&nbsp;63</span>&nbsp;<span style="color: #000000;">void&nbsp;&nbsp;&nbsp;CYQueueSyn</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::inq(T&nbsp;type)&nbsp;&nbsp;&nbsp;throw(CYException)&nbsp;<br></span><span style="color: #008080;">&nbsp;64</span>&nbsp;<span style="color: #000000;">{&nbsp;<br></span><span style="color: #008080;">&nbsp;65</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;rVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;WaitForSingleObject(m_writeSem,m_outtime);&nbsp;<br></span><span style="color: #008080;">&nbsp;66</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(rVal&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;WAIT_OBJECT_0)&nbsp;<br></span><span style="color: #008080;">&nbsp;67</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(WaitForSingleObject(m_synObject,INFINITE)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;WAIT_OBJECT_0)&nbsp;<br></span><span style="color: #008080;">&nbsp;69</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;70</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.push_back(type);&nbsp;<br></span><span style="color: #008080;">&nbsp;71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseMutex(m_synObject);&nbsp;<br></span><span style="color: #008080;">&nbsp;72</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="color: #008080;">&nbsp;73</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="color: #008080;">&nbsp;74</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(rVal&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;WAIT_TIMEOUT)&nbsp;<br></span><span style="color: #008080;">&nbsp;75</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;76</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;CYException(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">TIMEOUT</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;<br></span><span style="color: #008080;">&nbsp;77</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="color: #008080;">&nbsp;78</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(rVal&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;WAIT_ABANDONED)&nbsp;<br></span><span style="color: #008080;">&nbsp;79</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;80</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;CYException(</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ERROR</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;<br></span><span style="color: #008080;">&nbsp;81</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="color: #008080;">&nbsp;82</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ReleaseSemaphore(m_readSem,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">);&nbsp;<br></span><span style="color: #008080;">&nbsp;83</span>&nbsp;<span style="color: #000000;">}&nbsp;<br></span><span style="color: #008080;">&nbsp;84</span>&nbsp;<span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">class&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br></span><span style="color: #008080;">&nbsp;85</span>&nbsp;<span style="color: #000000;">T&nbsp;&nbsp;CYQueueSyn</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::outq()&nbsp;&nbsp;&nbsp;throw(CYException)&nbsp;<br></span><span style="color: #008080;">&nbsp;86</span>&nbsp;<span style="color: #000000;">{&nbsp;<br></span><span style="color: #008080;">&nbsp;87</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;&nbsp;value;&nbsp;<br></span><span style="color: #008080;">&nbsp;88</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;rVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;WaitForSingleObject(m_readSem,m_outtime);&nbsp;<br></span><span style="color: #008080;">&nbsp;89</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(rVal&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;WAIT_OBJECT_0)&nbsp;<br></span><span style="color: #008080;">&nbsp;90</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;91</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(WaitForSingleObject(m_synObject,INFINITE)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;WAIT_OBJECT_0)&nbsp;<br></span><span style="color: #008080;">&nbsp;92</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;93</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;queue.front();&nbsp;<br></span><span style="color: #008080;">&nbsp;94</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.pop_front();&nbsp;<br></span><span style="color: #008080;">&nbsp;95</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseMutex(m_synObject);&nbsp;<br></span><span style="color: #008080;">&nbsp;96</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="color: #008080;">&nbsp;97</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="color: #008080;">&nbsp;98</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(rVal&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;WAIT_TIMEOUT)&nbsp;<br></span><span style="color: #008080;">&nbsp;99</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="color: #008080;">100</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;CYException(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">TIMEOUT</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;<br></span><span style="color: #008080;">101</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="color: #008080;">102</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(rVal&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;WAIT_ABANDONED)&nbsp;<br></span><span style="color: #008080;">103</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="color: #008080;">104</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;CYException(</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">ERROR</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;<br></span><span style="color: #008080;">105</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="color: #008080;">106</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">107</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ReleaseSemaphore(m_writeSem,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">);&nbsp;<br></span><span style="color: #008080;">108</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;&nbsp;value;&nbsp;<br></span><span style="color: #008080;">109</span>&nbsp;<span style="color: #000000;">}&nbsp;<br></span><span style="color: #008080;">110</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">111</span>&nbsp;<span style="color: #000000;">#endif&nbsp;</span></div>
<br>如上，测试代码下载：http://www.pudn.com/downloads97/sourcecode/windows/other/109201257cqueue.rar<br><img src ="http://www.cppblog.com/kenlistian/aggbug/41183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-01-15 15:13 <a href="http://www.cppblog.com/kenlistian/archive/2008/01/15/41183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows 信号量的运用笔记</title><link>http://www.cppblog.com/kenlistian/archive/2007/12/04/37786.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 04 Dec 2007 06:18:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2007/12/04/37786.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/37786.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2007/12/04/37786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/37786.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/37786.html</trackback:ping><description><![CDATA[ 在windows下：

  信号量（Semaphore）内核对象对线程的同步方式，它允许多个线程在同一时刻访问同一资源，但是需要限制在同一时刻访问此资源的最大线程数目。
  
  CreateSemaphore()
  OpenSemaphore()
  ReleaseSemaphore(),
  WaitForSingleObject()/WaitForMultipleObjects()

  CreateSemaphore（）创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。
                        一般是将当前可用资源计数设置为最大资源计数，
                        每增加一个线程对共享资源的访问，当前可用资源计数就会减1，
      只要当前可用资源计数是大于0的，就可以发出信号量信号。
      但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目，不能在允许其他线程的进入，此时的信号量信号将无法发出。
      线程在处理完共享资源后，应在离开的同时通过ReleaseSemaphore()函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。


说明如下：
HANDLE CreateSemaphore(
　LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全属性指针
　LONG lInitialCount,                      // 初始计数
　LONG lMaximumCount,                // 最大计数， 定义了允许的最大资源计数
　LPCTSTR lpName                        // 对象名指针， 创建的信号量定义一个名字，其创建的是一个内核对象，因此在其他进程中可以通过该名字而得到此信号量
); 

OpenSemaphore()函数即可用来根据信号量名打开在其他进程中创建的信号量，函数原型如下：
HANDLE OpenSemaphore(
　DWORD dwDesiredAccess,      // 访问标志
　BOOL bInheritHandle,             // 继承标志
　LPCTSTR lpName                   // 信号量名
);

　在线程离开对共享资源的处理时，通过ReleaseSemaphore（）来增加当前可用资源计数。否则将会出现当前正在处理共享资源的实际线程数并没有达到要限制的数值，
而其他线程却因为当前可用资源计数为0而仍无法进入的情况。

BOOL ReleaseSemaphore(
　HANDLE hSemaphore,          // 信号量句柄
　LONG lReleaseCount,           // 计数递增数量
　LPLONG lpPreviousCount      // 先前计数,可以设置为NULL，
);

　　该函数将lReleaseCount中的值添加给信号量的当前资源计数，一般将lReleaseCount设置为1，

WaitForSingleObject和WaitForMultipleObjects主要用在试图进入共享资源的线程函数入口处，
主要用来判断信号量的当前可用资源计数是否允许本线程的进入。
只有在当前可用资源计数值大于0时，被监视的信号量内核对象才会得到通知。



 <img src ="http://www.cppblog.com/kenlistian/aggbug/37786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2007-12-04 14:18 <a href="http://www.cppblog.com/kenlistian/archive/2007/12/04/37786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>