⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wait_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<a name="l00264"></a>00264                 <span class="keywordflow">if</span> (result == WAIT_OBJECT_0)<a name="l00265"></a>00265                 {<a name="l00266"></a>00266                         <span class="keywordflow">if</span> (error == S_OK)<a name="l00267"></a>00267                                 <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00268"></a>00268                         <span class="keywordflow">else</span><a name="l00269"></a>00269                                 <span class="keywordflow">throw</span> <a class="code" href="class_wait_object_container_1_1_err.html" title="exception thrown by WaitObjectContainer">Err</a>(<span class="stringliteral">"WaitObjectContainer: WaitForMultipleObjects in thread failed with error "</span> + IntToString(error));<a name="l00270"></a>00270                 }<a name="l00271"></a>00271                 SetEvent(m_stopWaiting);<a name="l00272"></a>00272                 <span class="keywordflow">if</span> (result == WAIT_TIMEOUT)<a name="l00273"></a>00273                 {<a name="l00274"></a>00274                         SetLastResult(timeoutIsScheduledEvent ? LASTRESULT_SCHEDULED : LASTRESULT_TIMEOUT);<a name="l00275"></a>00275                         <span class="keywordflow">return</span> timeoutIsScheduledEvent;<a name="l00276"></a>00276                 }<a name="l00277"></a>00277                 <span class="keywordflow">else</span><a name="l00278"></a>00278                         <span class="keywordflow">throw</span> <a class="code" href="class_wait_object_container_1_1_err.html" title="exception thrown by WaitObjectContainer">Err</a>(<span class="stringliteral">"WaitObjectContainer: WaitForSingleObject failed with error "</span> + IntToString(::GetLastError()));<a name="l00279"></a>00279         }<a name="l00280"></a>00280         <span class="keywordflow">else</span><a name="l00281"></a>00281         {<a name="l00282"></a>00282 <span class="preprocessor">#if TRACE_WAIT</span><a name="l00283"></a>00283 <span class="preprocessor"></span>                <span class="keyword">static</span> <a class="code" href="class_timer.html" title="high resolution timer">Timer</a> t(<a class="code" href="class_timer_base.html#ce15d479a8bb76027f1f572010f62fb99e8b81c10efe9eccf48d6ee5f1c60d01">Timer::MICROSECONDS</a>);<a name="l00284"></a>00284                 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> lastTime = 0;<a name="l00285"></a>00285                 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> timeBeforeWait = t.<a class="code" href="class_timer_base.html#eab32d0bc5ca83836e0e9f9e108d66a4">ElapsedTime</a>();<a name="l00286"></a>00286 <span class="preprocessor">#endif</span><a name="l00287"></a>00287 <span class="preprocessor"></span>                DWORD result = ::WaitForMultipleObjects((DWORD)m_handles.size(), &amp;m_handles[0], FALSE, milliseconds);<a name="l00288"></a>00288 <span class="preprocessor">#if TRACE_WAIT</span><a name="l00289"></a>00289 <span class="preprocessor"></span>                <span class="keywordflow">if</span> (milliseconds &gt; 0)<a name="l00290"></a>00290                 {<a name="l00291"></a>00291                         <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> timeAfterWait = t.<a class="code" href="class_timer_base.html#eab32d0bc5ca83836e0e9f9e108d66a4">ElapsedTime</a>();<a name="l00292"></a>00292                         OutputDebugString((<span class="stringliteral">"Handles "</span> + IntToString(m_handles.size()) + <span class="stringliteral">", Woke up by "</span> + IntToString(result-WAIT_OBJECT_0) + <span class="stringliteral">", Busied for "</span> + IntToString(timeBeforeWait-lastTime) + <span class="stringliteral">" us, Waited for "</span> + IntToString(timeAfterWait-timeBeforeWait) + <span class="stringliteral">" us, max "</span> + IntToString(milliseconds) + <span class="stringliteral">"ms\n"</span>).c_str());<a name="l00293"></a>00293                         lastTime = timeAfterWait;<a name="l00294"></a>00294                 }<a name="l00295"></a>00295 <span class="preprocessor">#endif</span><a name="l00296"></a>00296 <span class="preprocessor"></span>                <span class="keywordflow">if</span> (result &gt;= WAIT_OBJECT_0 &amp;&amp; result &lt; WAIT_OBJECT_0 + m_handles.size())<a name="l00297"></a>00297                 {<a name="l00298"></a>00298                         <span class="keywordflow">if</span> (result == m_lastResult)<a name="l00299"></a>00299                                 m_sameResultCount++;<a name="l00300"></a>00300                         <span class="keywordflow">else</span><a name="l00301"></a>00301                         {<a name="l00302"></a>00302                                 m_lastResult = result;<a name="l00303"></a>00303                                 m_sameResultCount = 0;<a name="l00304"></a>00304                         }<a name="l00305"></a>00305                         <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00306"></a>00306                 }<a name="l00307"></a>00307                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result == WAIT_TIMEOUT)<a name="l00308"></a>00308                 {<a name="l00309"></a>00309                         SetLastResult(timeoutIsScheduledEvent ? LASTRESULT_SCHEDULED : LASTRESULT_TIMEOUT);<a name="l00310"></a>00310                         <span class="keywordflow">return</span> timeoutIsScheduledEvent;<a name="l00311"></a>00311                 }<a name="l00312"></a>00312                 <span class="keywordflow">else</span><a name="l00313"></a>00313                         <span class="keywordflow">throw</span> <a class="code" href="class_wait_object_container_1_1_err.html" title="exception thrown by WaitObjectContainer">Err</a>(<span class="stringliteral">"WaitObjectContainer: WaitForMultipleObjects failed with error "</span> + IntToString(::GetLastError()));<a name="l00314"></a>00314         }<a name="l00315"></a>00315 }<a name="l00316"></a>00316 <a name="l00317"></a>00317 <span class="preprocessor">#else // #ifdef USE_WINDOWS_STYLE_SOCKETS</span><a name="l00318"></a>00318 <span class="preprocessor"></span><a name="l00319"></a>00319 <span class="keywordtype">void</span> WaitObjectContainer::AddReadFd(<span class="keywordtype">int</span> fd, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>&amp; callStack) <span class="comment">// TODO: do something with callStack</span><a name="l00320"></a>00320 {<a name="l00321"></a>00321         FD_SET(fd, &amp;m_readfds);<a name="l00322"></a>00322         m_maxFd = STDMAX(m_maxFd, fd);<a name="l00323"></a>00323 }<a name="l00324"></a>00324 <a name="l00325"></a>00325 <span class="keywordtype">void</span> WaitObjectContainer::AddWriteFd(<span class="keywordtype">int</span> fd, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>&amp; callStack) <span class="comment">// TODO: do something with callStack</span><a name="l00326"></a>00326 {<a name="l00327"></a>00327         FD_SET(fd, &amp;m_writefds);<a name="l00328"></a>00328         m_maxFd = STDMAX(m_maxFd, fd);<a name="l00329"></a>00329 }<a name="l00330"></a>00330 <a name="l00331"></a>00331 <span class="keywordtype">bool</span> <a class="code" href="class_wait_object_container.html#15356e5e6f3329d8056ed7ba53290be6">WaitObjectContainer::Wait</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> milliseconds)<a name="l00332"></a>00332 {<a name="l00333"></a>00333         <span class="keywordflow">if</span> (m_noWait || (!m_maxFd &amp;&amp; !m_firstEventTime))<a name="l00334"></a>00334                 <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00335"></a>00335 <a name="l00336"></a>00336         <span class="keywordtype">bool</span> timeoutIsScheduledEvent = <span class="keyword">false</span>;<a name="l00337"></a>00337 <a name="l00338"></a>00338         <span class="keywordflow">if</span> (m_firstEventTime)<a name="l00339"></a>00339         {<a name="l00340"></a>00340                 <span class="keywordtype">double</span> timeToFirstEvent = SaturatingSubtract(m_firstEventTime, m_eventTimer.<a class="code" href="class_timer_base.html#3262a9d0815f1899701ee83c3ef8cf43">ElapsedTimeAsDouble</a>());<a name="l00341"></a>00341                 <span class="keywordflow">if</span> (timeToFirstEvent &lt;= milliseconds)<a name="l00342"></a>00342                 {<a name="l00343"></a>00343                         milliseconds = (<span class="keywordtype">unsigned</span> long)timeToFirstEvent;<a name="l00344"></a>00344                         timeoutIsScheduledEvent = <span class="keyword">true</span>;<a name="l00345"></a>00345                 }<a name="l00346"></a>00346         }<a name="l00347"></a>00347 <a name="l00348"></a>00348         timeval tv, *timeout;<a name="l00349"></a>00349 <a name="l00350"></a>00350         <span class="keywordflow">if</span> (milliseconds == <a class="code" href="cryptlib_8h.html#5dc7a255dd813433eeee3152544c2f1d" title="used to represent infinite time">INFINITE_TIME</a>)<a name="l00351"></a>00351                 timeout = NULL;<a name="l00352"></a>00352         <span class="keywordflow">else</span><a name="l00353"></a>00353         {<a name="l00354"></a>00354                 tv.tv_sec = milliseconds / 1000;<a name="l00355"></a>00355                 tv.tv_usec = (milliseconds % 1000) * 1000;<a name="l00356"></a>00356                 timeout = &amp;tv;<a name="l00357"></a>00357         }<a name="l00358"></a>00358 <a name="l00359"></a>00359         <span class="keywordtype">int</span> result = select(m_maxFd+1, &amp;m_readfds, &amp;m_writefds, NULL, timeout);<a name="l00360"></a>00360 <a name="l00361"></a>00361         <span class="keywordflow">if</span> (result &gt; 0)<a name="l00362"></a>00362                 <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00363"></a>00363         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result == 0)<a name="l00364"></a>00364                 <span class="keywordflow">return</span> timeoutIsScheduledEvent;<a name="l00365"></a>00365         <span class="keywordflow">else</span><a name="l00366"></a>00366                 <span class="keywordflow">throw</span> Err(<span class="stringliteral">"WaitObjectContainer: select failed with error "</span> + errno);<a name="l00367"></a>00367 }<a name="l00368"></a>00368 <a name="l00369"></a>00369 <span class="preprocessor">#endif</span><a name="l00370"></a>00370 <span class="preprocessor"></span><a name="l00371"></a>00371 <span class="comment">// ********************************************************</span><a name="l00372"></a>00372 <a name="l00373"></a><a class="code" href="class_call_stack.html#df8d5d77013825c39aa0b3c818722481">00373</a> std::string <a class="code" href="class_call_stack.html#df8d5d77013825c39aa0b3c818722481">CallStack::Format</a>()<span class="keyword"> const</span><a name="l00374"></a>00374 <span class="keyword"></span>{<a name="l00375"></a>00375         <span class="keywordflow">return</span> <a class="code" href="class_call_stack.html#ba49241ece3f7ac7530e1b03a28975fd">m_info</a>;<a name="l00376"></a>00376 }<a name="l00377"></a>00377 <a name="l00378"></a><a class="code" href="class_call_stack_with_nr.html#b5313303e4645caa5a79fb6cd499c61c">00378</a> std::string <a class="code" href="class_call_stack_with_nr.html#b5313303e4645caa5a79fb6cd499c61c">CallStackWithNr::Format</a>()<span class="keyword"> const</span><a name="l00379"></a>00379 <span class="keyword"></span>{<a name="l00380"></a>00380         <span class="keywordflow">return</span> std::string(<a class="code" href="class_call_stack.html#ba49241ece3f7ac7530e1b03a28975fd">m_info</a>) + <span class="stringliteral">" / nr: "</span> + IntToString(<a class="code" href="class_call_stack_with_nr.html#2d29fad3ff2fc724b2c58332fb8d60c3">m_nr</a>);<a name="l00381"></a>00381 }<a name="l00382"></a>00382 <a name="l00383"></a><a class="code" href="class_call_stack_with_str.html#79c362ebca363fe770f4bde43a0ec7aa">00383</a> std::string <a class="code" href="class_call_stack_with_str.html#79c362ebca363fe770f4bde43a0ec7aa">CallStackWithStr::Format</a>()<span class="keyword"> const</span><a name="l00384"></a>00384 <span class="keyword"></span>{<a name="l00385"></a>00385         <span class="keywordflow">return</span> std::string(<a class="code" href="class_call_stack.html#ba49241ece3f7ac7530e1b03a28975fd">m_info</a>) + <span class="stringliteral">" / "</span> + std::string(<a class="code" href="class_call_stack_with_str.html#87ab9f0c5671774acfefe95643cf454f">m_z</a>);<a name="l00386"></a>00386 }<a name="l00387"></a>00387 <a name="l00388"></a><a class="code" href="class_waitable.html#ded81bbe562f61932306a64e6122a6ca">00388</a> <span class="keywordtype">bool</span> <a class="code" href="class_waitable.html#ded81bbe562f61932306a64e6122a6ca" title="wait on this object">Waitable::Wait</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> milliseconds, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>&amp; callStack)<a name="l00389"></a>00389 {<a name="l00390"></a>00390         <a class="code" href="class_wait_object_container.html" title="container of wait objects">WaitObjectContainer</a> container;<a name="l00391"></a>00391         <a class="code" href="class_waitable.html#97155f28db33d3dacc69dc453a01609a" title="put wait objects into container">GetWaitObjects</a>(container, callStack);   <span class="comment">// reduce clutter by not adding this func to stack</span><a name="l00392"></a>00392         <span class="keywordflow">return</span> container.<a class="code" href="class_wait_object_container.html#15356e5e6f3329d8056ed7ba53290be6">Wait</a>(milliseconds);<a name="l00393"></a>00393 }<a name="l00394"></a>00394 <a name="l00395"></a>00395 NAMESPACE_END<a name="l00396"></a>00396 <a name="l00397"></a>00397 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Fri Jun 1 11:11:25 2007 for Crypto++ by&nbsp;<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.2 </small></address></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -