﻿<?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++博客-一动不如一静-随笔分类-ACE</title><link>http://www.cppblog.com/lijialian/category/1777.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 23:00:20 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 23:00:20 GMT</pubDate><ttl>60</ttl><item><title>TP_Reactor 学习笔记</title><link>http://www.cppblog.com/lijialian/archive/2007/02/25/18971.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Sun, 25 Feb 2007 12:41:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2007/02/25/18971.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/18971.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2007/02/25/18971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/18971.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/18971.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ACE_TP_Reactor::ACE_TP_Reactor (size_t max_number_of_handles,                                				int				 restart,                                ACE_Sig_Handler 				*				sh,                   ...&nbsp;&nbsp;<a href='http://www.cppblog.com/lijialian/archive/2007/02/25/18971.html'>阅读全文</a><img src ="http://www.cppblog.com/lijialian/aggbug/18971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2007-02-25 20:41 <a href="http://www.cppblog.com/lijialian/archive/2007/02/25/18971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>select_reactor的原码学习笔记</title><link>http://www.cppblog.com/lijialian/archive/2007/02/24/18950.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Sat, 24 Feb 2007 12:30:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2007/02/24/18950.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/18950.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2007/02/24/18950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/18950.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/18950.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 首先从定义一个reactor开始。ACE_TP_Reactor select_reactor_one(g_unOneMaxHandle, 0, 0, 0, 1);		上面的这句话触发了一下的一些行为。主要就是给event_handlers_分配了内存。这里就决定了你能支持多少条连接										int																ACE_Select_React...&nbsp;&nbsp;<a href='http://www.cppblog.com/lijialian/archive/2007/02/24/18950.html'>阅读全文</a><img src ="http://www.cppblog.com/lijialian/aggbug/18950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2007-02-24 20:30 <a href="http://www.cppblog.com/lijialian/archive/2007/02/24/18950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>N个Reactor是否就意味着支持N*FD_SETSIZE个连接呢？</title><link>http://www.cppblog.com/lijialian/archive/2007/02/22/18917.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Thu, 22 Feb 2007 15:25:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2007/02/22/18917.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/18917.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2007/02/22/18917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/18917.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/18917.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_0_835_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_835_Open_Text.style.display='none'; Codehighlighter1_0_835_Closed_Image.style.display='inline'; Codehighlighter1_0_835_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_0_835_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_835_Closed_Text.style.display='none'; Codehighlighter1_0_835_Open_Image.style.display='inline'; Codehighlighter1_0_835_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span id="Codehighlighter1_0_835_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
				<span id="Codehighlighter1_0_835_Open_Text">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">*******************************************************************<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />* Copyright (c) 2006,study-record home<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />* All rights reservered.<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />*<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />* 文件名称 : littersize.cpp <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />* 摘    要 : 这个例子主要是用来验证这样一个问题。当我们程序中有n个reactor的时候，是否就意味着我们支持n*FD_SETSIZE连接.<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                   为了验证这个问题,我们传递一个大小为2的值给ACE_Select_Reactor的构造函数。看是否是只支持2个连接?<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                   验证结果表明：在本例子中，由于acceptor注册用掉了一个，而我们给定的最大的handle数为2,所以只能接受一个连接。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                   在命令行下输入：telnet 127.0.0.1 1234 ,在我们第二次输入时，<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                   在调用int nRet = m_Reactor-&gt;register_handler(pEvent, ACE_Event_Handler::READ_MASK);的时候一定会失败。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                   但是在命令行下输入:telnet 127.0.0.1 2345 ,在我们第三次输入的时候，调用register_handler的时候才会失败<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                   但是这样的一段代码存在高cpu的问题，也就是当把客户端关调的时候，cpu占用率会很高?想想看，为什么呢？<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                   本代码只是为了验证一些东西，有很多不合理的地方，请务仿照。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />*<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />* 当前版本 : 1.0<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />* 作    者 : study-record   2007-2-22<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />*<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />********************************************************************</span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ace/Thread_Manager.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ace/Select_Reactor.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ace/Reactor.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ace/Event_Handler.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ace/SOCK_Acceptor.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ace/SOCK_Stream.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ace/INET_Addr.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> size_t g_unOneMaxHandle </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> size_t g_unTwoMaxhandle </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> ACE_THR_FUNC_RETURN event_loop_one (</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">arg) <br /><img id="Codehighlighter1_1173_1321_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1173_1321_Open_Text.style.display='none'; Codehighlighter1_1173_1321_Closed_Image.style.display='inline'; Codehighlighter1_1173_1321_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1173_1321_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1173_1321_Closed_Text.style.display='none'; Codehighlighter1_1173_1321_Open_Image.style.display='inline'; Codehighlighter1_1173_1321_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_1173_1321_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_1173_1321_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_Reactor </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">reacator </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> static_cast</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">ACE_Reactor </span>
						<span style="COLOR: #000000">*&gt;</span>
						<span style="COLOR: #000000">(arg);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    reacator</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">owner(ACE_Thread::self());<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    reacator</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">run_reactor_event_loop();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> ACE_THR_FUNC_RETURN event_loop_two (</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">arg) <br /><img id="Codehighlighter1_1378_1525_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1378_1525_Open_Text.style.display='none'; Codehighlighter1_1378_1525_Closed_Image.style.display='inline'; Codehighlighter1_1378_1525_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1378_1525_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1378_1525_Closed_Text.style.display='none'; Codehighlighter1_1378_1525_Open_Image.style.display='inline'; Codehighlighter1_1378_1525_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_1378_1525_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_1378_1525_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_Reactor </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">reacator </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> static_cast</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">ACE_Reactor </span>
						<span style="COLOR: #000000">*&gt;</span>
						<span style="COLOR: #000000">(arg);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    reacator</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">owner(ACE_Thread::self());<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    reacator</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">run_reactor_event_loop();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> TestHandleEvent: </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> ACE_Event_Handler<br /><img id="Codehighlighter1_1576_2006_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1576_2006_Open_Text.style.display='none'; Codehighlighter1_1576_2006_Closed_Image.style.display='inline'; Codehighlighter1_1576_2006_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1576_2006_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1576_2006_Closed_Text.style.display='none'; Codehighlighter1_1576_2006_Open_Image.style.display='inline'; Codehighlighter1_1576_2006_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_1576_2006_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_1576_2006_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">virtual</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> handle_input (ACE_HANDLE fd </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> ACE_INVALID_HANDLE)<br /><img id="Codehighlighter1_1650_1726_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1650_1726_Open_Text.style.display='none'; Codehighlighter1_1650_1726_Closed_Image.style.display='inline'; Codehighlighter1_1650_1726_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1650_1726_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1650_1726_Closed_Text.style.display='none'; Codehighlighter1_1650_1726_Open_Image.style.display='inline'; Codehighlighter1_1650_1726_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_1650_1726_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1650_1726_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        ACE_DEBUG((LM_DEBUG, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">TestHandleEvent::handle_input\n</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">virtual</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)<br /><img id="Codehighlighter1_1805_1900_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1805_1900_Open_Text.style.display='none'; Codehighlighter1_1805_1900_Closed_Image.style.display='inline'; Codehighlighter1_1805_1900_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1805_1900_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1805_1900_Closed_Text.style.display='none'; Codehighlighter1_1805_1900_Open_Image.style.display='inline'; Codehighlighter1_1805_1900_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_1805_1900_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1805_1900_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        ACE_DEBUG((LM_DEBUG, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">TestHandleEvent::handle_close\n</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        delete </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_HANDLE get_handle(</span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">const</span>
						<span style="COLOR: #000000"> <br /><img id="Codehighlighter1_1940_1971_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1940_1971_Open_Text.style.display='none'; Codehighlighter1_1940_1971_Closed_Image.style.display='inline'; Codehighlighter1_1940_1971_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1940_1971_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1940_1971_Closed_Text.style.display='none'; Codehighlighter1_1940_1971_Open_Image.style.display='inline'; Codehighlighter1_1940_1971_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_1940_1971_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1940_1971_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> peer.get_handle();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_SOCK_Stream peer;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> TestAcceptor : </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> ACE_Event_Handler<br /><img id="Codehighlighter1_2055_2943_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2055_2943_Open_Text.style.display='none'; Codehighlighter1_2055_2943_Closed_Image.style.display='inline'; Codehighlighter1_2055_2943_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2055_2943_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2055_2943_Closed_Text.style.display='none'; Codehighlighter1_2055_2943_Open_Image.style.display='inline'; Codehighlighter1_2055_2943_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_2055_2943_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_2055_2943_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">virtual</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> handle_input (ACE_HANDLE fd </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> ACE_INVALID_HANDLE)<br /><img id="Codehighlighter1_2129_2372_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2129_2372_Open_Text.style.display='none'; Codehighlighter1_2129_2372_Closed_Image.style.display='inline'; Codehighlighter1_2129_2372_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2129_2372_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2129_2372_Closed_Text.style.display='none'; Codehighlighter1_2129_2372_Open_Image.style.display='inline'; Codehighlighter1_2129_2372_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_2129_2372_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2129_2372_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        TestHandleEvent</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000"> pEvent </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> TestHandleEvent;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        acceptor.accept(pEvent</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">peer);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> nRet </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> m_Reactor</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">register_handler(pEvent, ACE_Event_Handler::READ_MASK);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (</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"> nRet)<br /><img id="Codehighlighter1_2316_2356_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2316_2356_Open_Text.style.display='none'; Codehighlighter1_2316_2356_Closed_Image.style.display='inline'; Codehighlighter1_2316_2356_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2316_2356_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2316_2356_Closed_Text.style.display='none'; Codehighlighter1_2316_2356_Open_Image.style.display='inline'; Codehighlighter1_2316_2356_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_2316_2356_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_2316_2356_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            delete pEvent;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            pEvent </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> NULL;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">virtual</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)<br /><img id="Codehighlighter1_2451_2561_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2451_2561_Open_Text.style.display='none'; Codehighlighter1_2451_2561_Closed_Image.style.display='inline'; Codehighlighter1_2451_2561_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2451_2561_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2451_2561_Closed_Text.style.display='none'; Codehighlighter1_2451_2561_Open_Image.style.display='inline'; Codehighlighter1_2451_2561_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_2451_2561_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2451_2561_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        ACE_DEBUG((LM_DEBUG, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">TestAcceptor::handle_close\n</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        acceptor.close();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        delete </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    TestAcceptor(ACE_Reactor</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> reactor):m_Reactor(reactor)<br /><img id="Codehighlighter1_2624_2630_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2624_2630_Open_Text.style.display='none'; Codehighlighter1_2624_2630_Closed_Image.style.display='inline'; Codehighlighter1_2624_2630_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2624_2630_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2624_2630_Closed_Text.style.display='none'; Codehighlighter1_2624_2630_Open_Image.style.display='inline'; Codehighlighter1_2624_2630_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_2624_2630_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2624_2630_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> open(unsigned </span>
						<span style="COLOR: #0000ff">short</span>
						<span style="COLOR: #000000"> usport)<br /><img id="Codehighlighter1_2667_2800_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2667_2800_Open_Text.style.display='none'; Codehighlighter1_2667_2800_Closed_Image.style.display='inline'; Codehighlighter1_2667_2800_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2667_2800_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2667_2800_Closed_Text.style.display='none'; Codehighlighter1_2667_2800_Open_Image.style.display='inline'; Codehighlighter1_2667_2800_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_2667_2800_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2667_2800_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        ACE_INET_Addr addr(usport);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        acceptor.open(addr);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> m_Reactor</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">register_handler(</span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">, ACE_Event_Handler::ACCEPT_MASK);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_HANDLE get_handle(</span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">const</span>
						<span style="COLOR: #000000"> <br /><img id="Codehighlighter1_2840_2878_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2840_2878_Open_Text.style.display='none'; Codehighlighter1_2840_2878_Closed_Image.style.display='inline'; Codehighlighter1_2840_2878_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2840_2878_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2840_2878_Closed_Text.style.display='none'; Codehighlighter1_2840_2878_Open_Image.style.display='inline'; Codehighlighter1_2840_2878_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_2840_2878_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2840_2878_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> acceptor.get_handle();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_SOCK_Acceptor acceptor;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_Reactor</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> m_Reactor;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> main (</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> argc, </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">argv[])<br /><img id="Codehighlighter1_2982_3593_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2982_3593_Open_Text.style.display='none'; Codehighlighter1_2982_3593_Closed_Image.style.display='inline'; Codehighlighter1_2982_3593_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2982_3593_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2982_3593_Closed_Text.style.display='none'; Codehighlighter1_2982_3593_Open_Image.style.display='inline'; Codehighlighter1_2982_3593_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_2982_3593_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_2982_3593_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_Select_Reactor select_reactor_one(g_unOneMaxHandle, </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_Reactor</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> reactor_one </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> ACE_Reactor(</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">select_reactor_one);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_Select_Reactor select_reactor_two(g_unTwoMaxhandle, </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_Reactor</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> reactor_two </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> ACE_Reactor(</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">select_reactor_two);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    TestAcceptor test_acceptor(reactor_one);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    test_acceptor.open(</span>
						<span style="COLOR: #000000">1234</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    TestAcceptor test_acceptorw(reactor_two);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    test_acceptorw.open(</span>
						<span style="COLOR: #000000">2345</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_Thread_Manager::instance()</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">spawn(event_loop_one, reactor_one);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ACE_Thread_Manager::instance()</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">spawn(event_loop_two, reactor_two);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> ACE_Thread_Manager::instance()</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">wait();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
<img src ="http://www.cppblog.com/lijialian/aggbug/18917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2007-02-22 23:25 <a href="http://www.cppblog.com/lijialian/archive/2007/02/22/18917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异步I/O</title><link>http://www.cppblog.com/lijialian/archive/2006/10/07/13410.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Sat, 07 Oct 2006 05:57:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2006/10/07/13410.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/13410.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2006/10/07/13410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/13410.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/13410.html</trackback:ping><description><![CDATA[一直对异步IO怀有恐惧之心，所以到现在也没有仔细的去研究过，但是老师怎么告诉我们说要用于面对困难，所以决定坐下来研究一下，看看到底有多高深,不向困难低头^_^<br /><br />资源：http://www.zahui.com/html/9/35437.htm<img src ="http://www.cppblog.com/lijialian/aggbug/13410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2006-10-07 13:57 <a href="http://www.cppblog.com/lijialian/archive/2006/10/07/13410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ACE_TP_Reactor</title><link>http://www.cppblog.com/lijialian/archive/2006/10/07/13408.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Sat, 07 Oct 2006 03:29:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2006/10/07/13408.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/13408.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2006/10/07/13408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/13408.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/13408.html</trackback:ping><description><![CDATA[前段时间用了ACE_TP_Reactor做了一个东西，但是对这块东西不是很有底，所以借着假期仔细的看了一下这一块的东西，又上网查了一下相关的资料。<br /><br />在Addison-Wesley - C++NetworkProgrammingVol2的4.3 The ACE_TP_Reactor Class中有这样几句话，让我足足想了一天。<br /><br />1.Multiple threads running an <tt>ACE_TP_Reactor</tt> event loop can process 
events concurrently on different handles<br />2.They can also dispatch timeout and I/O callback methods concurrently on the same 
event handler<br />3.The only serialization in the <tt>ACE_TP_Reactor</tt> occurs when I/O events 
occur concurrently on the <span class="docEmphasis">same</span> handle<br />4.After a thread obtains a set of active handles from <tt>select()</tt>, the other 
reactor threads dispatch from that handle set instead of calling 
<tt>select()</tt> again<br /><br />其实上面的3句话主要表达这样的几层含义<br />1.并行处理不同handle上的事件<br />2.并行处理同一event handler上的超时回调函数和I/O回调函数<br />3.多个线程串行处理同一个handle上的I/O事件。<br />4.虽然TP_Reactor是用leader/follow模式轮流调用select,但是如果一个select()获得了多个激活的handle,那么其他的线程会分发这些handle ，而不是去再次调用select.<br /> (这点还没有想通，也没有看见是如何实现的？)<br /><br /><u>“多个线程串行处理同一个handle上的I/O事件”</u><br />        这个是如何达到的呢？ACE源码中，当处理I/O事件的时候，会将<font size="3"><span style="font-family: 宋体;"></span><span lang="EN-US"><font face="Times New Roman">HANDLE</font></span><span style="font-family: 宋体;"></span></font>挂起，使得不再对该<font size="3"><span style="font-family: 宋体;"></span><span lang="EN-US"><font face="Times New Roman">HANDLE</font></span><span style="font-family: 宋体;"></span></font>做事件侦听。来达到同一个<font size="3"><span style="font-family: 宋体;"></span><span lang="EN-US"><font face="Times New Roman">handle上</font></span><span style="font-family: 宋体;">的I/O事件是被多个线程串行地处理。</span></font><br /><br /><u>"并行处理同一event handler上的超时回掉函数和I/O回调函数"</u><br />       这样好像就比较麻烦了。因为这就意味着TP_Reactor只保证同一个handle下不会有多线程同时调用I/O事件，但是却有可能同时调用超时回调函数和I/O回调函数。如果在这两个函数中有对数据的访问和操作，这就意味着需要有锁的引入。例外，如果在定时器处理中，超过定时的事件间隔，就会有令一个线程再次调用定时器的处理函数，一下子引入了很多同步的问题。如何解决这个问题呢？<br /><br />方法一：<br /><br />            更改ACE的源码，象处理socket事件一样，在处理定时事件的时候，也把HANDLE挂起。来自http://cpunion.cnblogs.com/archive/2005/08/09/210941.html<br /><br /><div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;"><div><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"><br />ACE_TP_Reactor::handle_timer_events (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">event_count</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);">,<br />                                     ACE_TP_Token_Guard </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">guard)<br />{<br />  </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Get the current time</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">  ACE_Time_Value cur_time (</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">timer_queue_</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">gettimeofday () </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br />                           </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">timer_queue_</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">timer_skew ());<br /><br />  </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Look for a node in the timer queue whose timer &lt;= the present<br />  </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> time.</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">  ACE_Timer_Node_Dispatch_Info info;<br /><br />  </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">timer_queue_</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">dispatch_info (cur_time,<br />                                         info))<br />    {<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> ******** fixed by lijie ***********</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (info.type_</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">get_handle () </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> ACE_INVALID_HANDLE)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">is_suspended_i (info.type_</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">get_handle ()))<br />                </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /><br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">suspend_handler (info.type_</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">get_handle ());<br />        }<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> ******** end **********************</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">upcall_act </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /><br />      </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Preinvoke.</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">timer_queue_</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">preinvoke (info,<br />                                     cur_time,<br />                                     upcall_act);<br /><br />      <br /><br />      </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Release the token before dispatching notifies<img src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      guard.release_token ();<br /><br />      </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> call the functor</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">timer_queue_</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">upcall (info,<br />                                  cur_time);<br /><br />      </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Postinvoke</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">timer_queue_</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">postinvoke (info,<br />                                      cur_time,<br />                                      upcall_act);<br /><br />      </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> We have dispatched a timer</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br />    }<br /><br />  </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />}</span></div></div><br />handle_timer处理完以后，返回以前，加上这句话<br />this-&gt;reactor ()-&gt;resume_handler (this-&gt;get_handle ());<br /><br />当然别忘了为Handler编写get_handle()函数：<br /><div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;"><div><span style="color: rgb(0, 0, 0);">ACE_HANDLE Test_Handler::get_handle () </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"><br />{<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">peer ().get_handle ();<br />}</span></div></div><br /><br />方法二：<br />                <font size="3"><span style="font-family: 宋体;">利用</span><span lang="EN-US"><font face="Times New Roman">ACE_Pipe</font></span><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman">ACE_Message_Queue</font></span><span style="font-family: 宋体;">把所有的事件都排队到同一个</span><span lang="EN-US"><font face="Times New Roman">I/O HANDLE</font></span><span style="font-family: 宋体;">上去，再由</span><span lang="EN-US"><font face="Times New Roman">ACE_TP_Reactor</font></span><span style="font-family: 宋体;">通过多个线程<strong style=""><u>顺序串行地</u></strong>触发我们旧的</span><span lang="EN-US"><font face="Times New Roman">event_handler</font></span><span style="font-family: 宋体;">来处理这些已经排好队的事件</span><span lang="EN-US"><font face="Times New Roman">/</font></span><span style="font-family: 宋体;">消息。我比较赞成用这样方法。该方法来自：</span></font>http://blog.csdn.net/zhdaniel/archive/2006/06/29/850888.aspx<br />    <br /><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhdaniel/%E5%9B%BE2.jpg" height="308" width="664" /></span></font></p>        <br /><br /><br />方法三：<br />                ^_^干脆就不要对同一个event  handler注册I/O事件和其他事件。<br /><br /><br /><br /><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><br /><font size="3"><span style="font-family: 宋体;"><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"></v:shapetype></span></span></font></p><br /><img src ="http://www.cppblog.com/lijialian/aggbug/13408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2006-10-07 11:29 <a href="http://www.cppblog.com/lijialian/archive/2006/10/07/13408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于MPC的问题收集</title><link>http://www.cppblog.com/lijialian/archive/2006/06/24/8949.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Sat, 24 Jun 2006 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2006/06/24/8949.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/8949.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2006/06/24/8949.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/8949.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/8949.html</trackback:ping><description><![CDATA[来源:<br />http://www.ociweb.com/products/mpc/faq.html#006<br /><br />Q :当生成工程文件名称的时候,可以改变工程文件的名称吗?<br />A:当用MPC生成工程文件的时候,可以用-name_modifier 选项来修改工程文件名称.如果你也想修改工程的名称,可以增加-apply_project.如下:<br />mwc.pl -static -type vc6 -name_modifier *_Static -apply_project<br />如果用了这些选项,所有的工作空间,工程文件和工程名都以_Static结尾.<br /><br />Q:怎样用MPC在每个目录生成一个工作空间?<br />A:当运行mwc.pl的时候加上-hierarchy选项.对于所有基于'make'的工作空间是默认的.<br /><br />Q:怎样告诉MPC在寻找mwc和mpc文件时,不要寻找某个特殊的路径?<br />A:-exclude可以用于这个目的.但是这个路径必须是一个相对于MPC运行的路径.如:<br />mwc.pl -exclude this_dir,this_dir_too,and_another_dir<br /><br />Q:怎样在我的工作空间中用-value_template<br />A:在mwc文件中,你能用很多mwc.pl的命令行选项.要加上cmdline关键字.如果在命令行中需要有空格,必须包含在""之中.如:<br />workspace {<br />  // Set the command line value to change the configurations with vc6, vc71 and vc8<br />  cmdline += -value_template "configurations='MFC Release' 'MFC Debug'"<br />}<br /><br />Q:有没有办法在Solaris,工程中包含一个文件,但是在Linux上不包含该文件呢?<br />A:你可以用feature定义一个base工程.如下:<br />// config/default.features<br />solaris_only = 0<br /><br /><br />// some_base.mpb<br />feature(solaris_only) {<br />  Source_Files {<br />    source1.cpp <br />    source2.cpp <br />  }<br />}  <br /><br /><br />// your_project.mpc<br />project: some_base {<br />  Source_Files {<br />    source3.cpp <br />    source4.cpp <br />  }<br />}  <br /><br />Q:可不可以一些选项用于某客户文件,而另外一些用于其他的客户文件呢?<br />A:你可以为用户的输入文件创建多个部分.如下:<br /><pre>project: foo {<br />  FOO_Files { <br />    foo.file  <br />  }<br /><br />  FOO_Files {<br />    commandflags += -QR<br />    bar.file<br />  }<br />} </pre>Q:有没有办法表明编译选项?<br />A:可以用'specific' .如:<br />project {<br /><br />  specific(make) {<br />    compile_flags += -fcheck-new<br />  }<br /><br />  specific(vc71) {<br />    compile_flags += /wd4103<br />  }<br />}  <br /><br />Q:在一个工作空间中,想有静态和动态的工程?<br />A:在mwc文件中,建立一个域范围.增加-static到命令行选项.如:<br />workspace {<br />  // These projects will be static<br />  some_scope_name {<br />    cmdline += -static<br />    my_projects_dir   <br />    my_other_projects_dir<br />  }<br /><br />  // Anything outside the scope will have the command line options provided at the start of mwc.pl<br />  another_dir<br />}<br /><br />Q:有没有方法在mpc文件中表明这个库必须是静态库,其他的库不能把它用做动态库?<br />A:设置静态库名,而动态库名为空.<br />project {<br />  sharedname =<br />  staticname = foo<br />}<br /><br />Q:MPC添加d.lib到所有的库.有没有办法关掉它?<br />A:在mpc文件中用'lit_libs'代替libs<br /><br />Q:为vc6和vc71生成静态工程,可是却没有工程的依赖?<br />A:可以通过设置MPC_DEPENDENCY_COMBINED_STATIC_LIBRARY环境变量,强迫MPC生成工程间相互依赖的的静态库.<br /><br />Q:有没有方法可以强制在静态库名后有's'但是debug版本没有'd'<br />A:是的,你能设置lib_modifier,用这个配置座位域修改器.在下面的例子中,假设-static选项已经传递给了MPC<br />project {<br />  // Override the values of 's' and 'sd' respectively.<br />  specific {<br />    Release::lib_modifier =<br />    Debug::lib_modifier = d<br />  }<br />}  <br /><br />Q:由MPC生成的VC71工程,用release ,生成的执行文件在release目录中.而debug是在"."目录中,怎样才能把执行文件放在debug目录中.     <br />A: 增加改行到MPC工程中<br />project {                    <br />  specific(nmake, vc6, vc7, vc71, vc8) {<br />    Debug::install = Debug<br />  }<br />}<br /><br />Q:如何生成支持MFC的版本<br />A:MPC的命令行增加下面一行<br />-value_template "configurations='MFC Release' 'MFC Debug'"<br />这个可以用于 em3, nmake, vc6, vc7, vc71 和 vc8 工程类型的配置<br />提醒一下，别忘了创建config.h文件，内容类似如下：<br />#include "config-win32.h"<br />#include "config-win32-msvc-7.h"<br /><br /><br /><br /><img src ="http://www.cppblog.com/lijialian/aggbug/8949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2006-06-24 10:18 <a href="http://www.cppblog.com/lijialian/archive/2006/06/24/8949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络编程卷2  ACE_WFMO_Reactor的并发考虑</title><link>http://www.cppblog.com/lijialian/archive/2006/06/23/8906.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Fri, 23 Jun 2006 12:48:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2006/06/23/8906.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/8906.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2006/06/23/8906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/8906.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/8906.html</trackback:ping><description><![CDATA[        ACE_WFMO_Reactor允许多个线程并发的调用handle_events(),这个能力的增加使得它的设计变的复杂,并且引入了一些同基于select的反应器不同的地方.不同点如下:<br /><ul><li>注册改变的协调.已注册句柄集合的每一个改变,将会影响到所有执行事件循环的线程.在没有同步的情况下允许这些改变的发生,会导致丢失事件,或不正确,不合法的句柄被分发.为了在多线程的情况下,正确的处理注册发生改变的情况,ACE_WFMO_Reactor维持了三个句柄信息集合对象.</li></ul><ol><li>用作事件侦查和分发的当前句柄</li><li>新句柄, 除了当前句柄集合,新句柄也在等待</li><li>挂起句柄,是当前句柄中挂起的句柄</li></ol>当需要改变已注册的句柄时,(例如:注册,移除,挂起和恢复一个事件处理器),要记住句柄,事件处理器,事件类型信息,和相关信息的记录.下一个完成handle_events的线程会注意到这个改变,获取reactor的锁,等待所有其他正在运行handle_events的线程完成.为了能让这些线程及时的完成,等待的线程发送一个内部事件,该内部事件是分发句柄集合的一部分.唤醒所有阻塞在WaitForMultipleObjects的线程.这个时候,所有的事件处理线程将会阻塞在等待变化的发生.当原始的线程完成必要的信息和句柄改变后,释放reactor的锁.所有的事件处理线程重新开始在更新后的句柄集合上进行等待,分离和分发.<br /><ul><li>推迟事件处理器的清除.ACE_WFMO_Reactor注册改变的延迟引入了一些与基于select()的反应器的不同之处.当hanle_*()方法返回-1或者ACE_Reactor::remove_handler()被事件处理器调用时,它推迟事件处理器的移除和handle_close()钩子函数的回调,直到上面说讲的注册改变发生.所以一个应用在请求ACE_WFMO_Reactor移除一个事件处理器之后,不能立即删除该事件处理器,否则reator后来调用的handle_close()方法会分发一个无效的指针.</li></ul><img src ="http://www.cppblog.com/lijialian/aggbug/8906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2006-06-23 20:48 <a href="http://www.cppblog.com/lijialian/archive/2006/06/23/8906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACE的相关的几个网址</title><link>http://www.cppblog.com/lijialian/archive/2006/06/13/8500.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Tue, 13 Jun 2006 07:23:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2006/06/13/8500.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/8500.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2006/06/13/8500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/8500.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/8500.html</trackback:ping><description><![CDATA[两本书的错误的更新<a href="http://www.cs.wustl.edu/%7Eschmidt/ACE/book1/Errata.txt"><br />http://www.cs.wustl.edu/~schmidt/ACE/book1/Errata.txt</a><br /><a href="http://www.cs.wustl.edu/%7Eschmidt/ACE/book2/Errata.txt">http://www.cs.wustl.edu/~schmidt/ACE/book2/Errata.txt</a><br /><br />英文讨论组<br /><a href="http://groups.google.com/group/comp.soft-sys.ace">http://groups.google.com/group/comp.soft-sys.ace</a><br /><br />http://groups.google.com/group/comp.soft-sys.ace?lnk=oa<br /><br />中文讨论区<br /><a href="http://forum.huihoo.com/forumdisplay.php?fid=125">http://forum.huihoo.com/forumdisplay.php?fid=125</a><br /><br />相关文档<br /><a href="http://www.cs.wustl.edu/%7Eschmidt/ACE.html" target="_blank"><font color="#333399">http://www.cs.wustl.edu/~schmidt/ACE.html</font></a><br /><br />有关mpc问题<br />http://www.ociweb.com/products/mpc/faq.html#021<br /><br />源码中标记的含义<br />http://www.stack.nl/~dimitri/doxygen/commands.html<br /><img src ="http://www.cppblog.com/lijialian/aggbug/8500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2006-06-13 15:23 <a href="http://www.cppblog.com/lijialian/archive/2006/06/13/8500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非阻塞Acceptor的动机</title><link>http://www.cppblog.com/lijialian/archive/2006/06/12/8446.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Mon, 12 Jun 2006 03:18:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2006/06/12/8446.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/8446.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2006/06/12/8446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/8446.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/8446.html</trackback:ping><description><![CDATA[这篇内容来自c++网络编程卷1 第七章 ACE同步事件分离封装. <br /><br />                                                              Sidebar 14: Motivation for Nonblocking Acceptors<br /><br />         当把一个Acceptor socket传递给select(),如果收到一个链接,那么该socket被标识为激活状态.很多服务器利用这个事件去表明可以调用accept(),不会引起阻塞.不幸的是,有来自TCP/IP异步行为的资源竞争.在实际中,select()之后就表明一个acceptor socket是激活的(但是在accept()调用之前),client可以关闭它的连接,一旦accept()阻塞潜在的挂起整个进程.为了避免这个问题,<strong>acceptor socket当和select()一起使用的时候,应该一直被设置为非阻塞的模式</strong>.在ACE中,这步工作很方便,只要传递ACE_NONBLOCK标识给enable()方法就可以了.enable()方法是ACE_IPC_SAP提供的,所以ACE_SOCK_Acceptor也拥有.<img src ="http://www.cppblog.com/lijialian/aggbug/8446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2006-06-12 11:18 <a href="http://www.cppblog.com/lijialian/archive/2006/06/12/8446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>error LNK2019:无法解析的外部符号</title><link>http://www.cppblog.com/lijialian/archive/2006/06/11/8435.html</link><dc:creator>一动不如一静</dc:creator><author>一动不如一静</author><pubDate>Sun, 11 Jun 2006 15:18:00 GMT</pubDate><guid>http://www.cppblog.com/lijialian/archive/2006/06/11/8435.html</guid><wfw:comment>http://www.cppblog.com/lijialian/comments/8435.html</wfw:comment><comments>http://www.cppblog.com/lijialian/archive/2006/06/11/8435.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/lijialian/comments/commentRss/8435.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lijialian/services/trackbacks/8435.html</trackback:ping><description><![CDATA[1.最好先用ACE自身的例子,测试所编库的正确性.<br />2.确保ACE.lib或ACEd.lib能正确的链接到工程中.<br />3.如果出现"__declspec(dllimport) int __cdecl ace_os_main_i"字样的链接错误,可以考虑加上#include "ace/OS_main.h"<img src ="http://www.cppblog.com/lijialian/aggbug/8435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lijialian/" target="_blank">一动不如一静</a> 2006-06-11 23:18 <a href="http://www.cppblog.com/lijialian/archive/2006/06/11/8435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>