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

📄 asynccalls.html

📁 Asyncronous call of delphi functions and procedures.
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<br><span class="u5">function</span>&nbsp;<span class="u4">AsyncCallEx</span><span class="u9">(</span><span class="u4">Method</span><span class="u9">:</span>&nbsp;<span class="u4">TAsyncCallArgRecordMethod</span><span class="u9">;</span>&nbsp;<span class="u5">var</span>&nbsp;<span class="u4">Arg</span><span class="u1">{:&nbsp;TRecordType}</span><span class="u9">):</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>&nbsp;<span class="u5">overload</span><span class="u9">;</span>
<br><span class="u5">function</span>&nbsp;<span class="u4">AsyncCallEx</span><span class="u9">(</span><span class="u4">Method</span><span class="u9">:</span>&nbsp;<span class="u4">TAsyncCallArgRecordEvent</span><span class="u9">;</span>&nbsp;<span class="u5">var</span>&nbsp;<span class="u4">Arg</span><span class="u1">{:&nbsp;TRecordType}</span><span class="u9">):</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>&nbsp;<span class="u5">overload</span><span class="u9">;</span>
</div>
<ul>
 <li><b>Proc/Method</b>: Function that should be executed asynchron.
 <li><b>Arg</b>: User defined value type (record).
</ul>
<h3 class="Example">Example</h3>
<div class="code"><span class="u5">type</span>
<br>&nbsp;&nbsp;<span class="u4">TData</span>&nbsp;<span class="u9">=</span>&nbsp;<span class="u5">record</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Value</span><span class="u9">:</span>&nbsp;<span class="u4">Integer</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u5">end</span><span class="u9">;</span>
<br>
<br><span class="u5">procedure</span>&nbsp;<span class="u4">TestRec</span><span class="u9">(</span><span class="u5">var</span>&nbsp;<span class="u4">Data</span><span class="u9">:</span>&nbsp;<span class="u4">TData</span><span class="u9">);</span>
<br><span class="u5">begin</span>
<br>&nbsp;&nbsp;<span class="u4">Data</span><span class="u9">.</span><span class="u4">Value</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u6">70</span><span class="u9">;</span>
<br><span class="u5">end</span><span class="u9">;</span>
<br>
<br><span class="u4">a</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">AsyncCallEx</span><span class="u9">(@</span><span class="u4">TestRec</span><span class="u9">,</span>&nbsp;<span class="u4">MyData</span><span class="u9">);</span>
<br><span class="u1">{ Don't access "MyData" here until the async. function has finished. }</span>
<br><span class="u4">a</span><span class="u9">.</span><span class="u4">Sync</span><span class="u9">;</span>&nbsp;<span class="u1">//&nbsp;MyData.Value&nbsp;is&nbsp;now&nbsp;70</span>
</div>



<p>&nbsp;</p>
<h2>AsyncCall functions with a variable number of arguments</h2>
<p>This AsyncCall() functions start a specified asynchronous function with a variable number of argument. The asynchron function must be declared as
<span class"u5">cdecl</span> and the argument's modifier must be <span class"u5">const</span> for Variants. All other types can have the
<span class"u5">const</span> modified but it is not necessary.</p>
<div class="code">
<span class="u5">function</span>&nbsp;<span class="u4">AsyncCall</span><span class="u9">(</span><span class="u4">Proc</span><span class="u9">:</span>&nbsp;<span class="u4">TCdeclFunc</span><span class="u9">;</span>&nbsp;<span class="u5">const</span>&nbsp;<span class="u4">Args</span><span class="u9">:</span>&nbsp;<span class="u5">array</span>&nbsp;<span class="u5">of</span>&nbsp;<span class="u5">const</span><span class="u9">):</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>&nbsp;<span class="u5">overload</span><span class="u9">;</span>
<br><span class="u5">function</span>&nbsp;<span class="u4">AsyncCall</span><span class="u9">(</span><span class="u4">Proc</span><span class="u9">:</span>&nbsp;<span class="u4">TCdeclMethod</span><span class="u9">;</span>&nbsp;<span class="u5">const</span>&nbsp;<span class="u4">Args</span><span class="u9">:</span>&nbsp;<span class="u5">array</span>&nbsp;<span class="u5">of</span>&nbsp;<span class="u5">const</span><span class="u9">):</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>&nbsp;<span class="u5">overload</span><span class="u9">;</span>
</div>
<ul>
 <li><b>Proc/Method</b>: Function that should be executed asynchron.
 <li><b>Args</b>: An open array that specifies the asynchron function arguments. The values are either copied or the reference counter
 is increased during the execution of the asynchron function.
</ul>



<p>&nbsp;</p>
<h2>AsyncMultiSync</h2>
<p>AsyncMultiSync() waits for the async calls and other handles to finish.
   MsgAsyncMultiSync() waits for the async calls, other handles and the message queue.</p>
<div class="code">
<span class="u5">function</span>&nbsp;<span class="u4">AsyncMultiSync</span><span class="u9">(</span><span class="u5">const</span>&nbsp;<span class="u4">List</span><span class="u9">:</span>&nbsp;<span class="u5">array</span>&nbsp;<span class="u5">of</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>&nbsp;<span class="u4">WaitAll</span><span class="u9">:</span>&nbsp;<span class="u4">Boolean</span>&nbsp;<span class="u9">=</span>&nbsp;<span class="u4">True</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">Milliseconds</span><span class="u9">:</span>&nbsp;<span class="u4">Cardinal</span>&nbsp;<span class="u9">=</span>&nbsp;<span class="u4">INFINITE</span><span class="u9">):</span>&nbsp;<span class="u4">Cardinal</span><span class="u9">;</span>
<br><span class="u5">function</span>&nbsp;<span class="u4">AsyncMultiSyncEx</span><span class="u9">(</span><span class="u5">const</span>&nbsp;<span class="u4">List</span><span class="u9">:</span>&nbsp;<span class="u5">array</span>&nbsp;<span class="u5">of</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>&nbsp;<span class="u5">const</span>&nbsp;<span class="u4">Handles</span><span class="u9">:</span>&nbsp;<span class="u5">array</span>&nbsp;<span class="u5">of</span>&nbsp;<span class="u4">THandle</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">WaitAll</span><span class="u9">:</span>&nbsp;<span class="u4">Boolean</span>&nbsp;<span class="u9">=</span>&nbsp;<span class="u4">True</span><span class="u9">;</span>&nbsp;<span class="u4">Milliseconds</span><span class="u9">:</span>&nbsp;<span class="u4">Cardinal</span>&nbsp;<span class="u9">=</span>&nbsp;<span class="u4">INFINITE</span><span class="u9">):</span>&nbsp;<span class="u4">Cardinal</span><span class="u9">;</span>
<br><span class="u5">function</span>&nbsp;<span class="u4">MsgAsyncMultiSync</span><span class="u9">(</span><span class="u5">const</span>&nbsp;<span class="u4">List</span><span class="u9">:</span>&nbsp;<span class="u5">array</span>&nbsp;<span class="u5">of</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>&nbsp;<span class="u4">WaitAll</span><span class="u9">:</span>&nbsp;<span class="u4">Boolean</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">Milliseconds</span><span class="u9">:</span>&nbsp;<span class="u4">Cardinal</span><span class="u9">;</span>&nbsp;<span class="u4">dwWakeMask</span><span class="u9">:</span>&nbsp;<span class="u4">DWORD</span><span class="u9">):</span>&nbsp;<span class="u4">Cardinal</span><span class="u9">;</span>
<br><span class="u5">function</span>&nbsp;<span class="u4">MsgAsyncMultiSyncEx</span><span class="u9">(</span><span class="u5">const</span>&nbsp;<span class="u4">List</span><span class="u9">:</span>&nbsp;<span class="u5">array</span>&nbsp;<span class="u5">of</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>&nbsp;<span class="u5">const</span>&nbsp;<span class="u4">Handles</span><span class="u9">:</span>&nbsp;<span class="u5">array</span>&nbsp;<span class="u5">of</span>&nbsp;<span class="u4">THandle</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">WaitAll</span><span class="u9">:</span>&nbsp;<span class="u4">Boolean</span><span class="u9">;</span>&nbsp;<span class="u4">Milliseconds</span><span class="u9">:</span>&nbsp;<span class="u4">Cardinal</span><span class="u9">;</span>&nbsp;<span class="u4">dwWakeMask</span><span class="u9">:</span>&nbsp;<span class="u4">DWORD</span><span class="u9">):</span>&nbsp;<span class="u4">Cardinal</span><span class="u9">;</span>
</div>
<blockquote>
<h3>Arguments</h3>
<blockquote>
<table border="0" width="100%" style="background-color: #f0f0f0;">
<tr>
 <td valign="top" width="150"><b>List</b></td>
 <td valign="top">An array of IAsyncCall interfaces for which the function should wait.</td>
</tr>
<tr>
 <td valign="top" width="150"><b>Handles</b></td>
 <td valign="top">An array of THandle for which the function should wait.</td>
</tr>
<tr>
 <td valign="top" width="150"><b>WaitAll = True</b></td>
 <td valign="top">The function returns when all listed async calls have
     finished. If Milliseconds is INFINITE the async calls
     meight be executed in the current thread.
     The return value is zero when all async calls have finished.
     Otherwise it is <b>WAIT_FAILED</b>.</td>
</tr>
<tr>
 <td valign="top" width="150"><b>WaitAll = False</b></td>
 <td valign="top">The function returns when at least one of the async calls
     has finished. The return value is the list index of the
     first finished async call. If there was a timeout, the
     return value is <b>WAIT_FAILED</b>.</td>
</tr>
<tr>
 <td valign="top" width="150"><b>Milliseconds</b></td>
 <td valign="top">Specifies the number of milliseconds to wait until a
     timeout happens. The value INFINITE lets the function wait
     until all async calls have finished.</td>
</tr>
<tr>
 <td valign="top" width="150"><b>dwWakeMask</b></td>
 <td valign="top">see Windows.MsgWaitForMultipleObjects()</td>
</tr>
</table></blockquote>
<h3>Limitations</h3>
<blockquote><p>Length(List)+Length(Handles) must not exceed <b>MAXIMUM_ASYNC_WAIT_OBJECTS</b> &nbsp;&nbsp;(61 elements).</p></blockquote>
<h3>Return value</h3>
<blockquote>
<ul>
 <li><b>WAIT_TIMEOUT</b><br/>
     The function timed out<br/>&nbsp;</li>

 <li><b>WAIT_OBJECT_0+index</b><br/>
     The first finished async call</li>
 <li><b>WAIT_OBJECT_0+Length(List)+index</b><br/>
     The first signaled handle</li>
 <li><b>WAIT_OBJECT_0+Length(List)+Length(Handles)</b><br/>
     A message was signaled<br/>&nbsp;</li>
	 
 <li><b>WAIT_ABANDONED_0+index</b><br/>
     The abandoned async call</li>
 <li><b>WAIT_ABANDONED_0+Length(List)+index</b><br/>
     The abandoned handle<br/>&nbsp;</li>

<li><b>WAIT_FAILED</b><br/>
     The function failed</li>
</ul>
</blockquote>
</blockquote> 








<p>&nbsp;</p>
<hr noshade="noshade">
<p>&nbsp;</p>
<h2>AsyncCalls Internals - Thread pool and waiting-queue</h2>
<p>An execution request is added to the waiting-queue when an async. function is started. This request forces the thread pool to
check if there is an idle/suspended thread that could do the job. If such a thread exists, it is reactivated/resumed. If no thread
is available then it depends on the number of threads in the pool what happens. If the maximum thread number is already reached the
request remains in the waiting-queue. Otherwise a new thread is added to the thread pool.</p>
<p>Threads that aren't idle/suspended take the oldest request from the waiting-queue an execute the associated async. function. If the
waiting queue is empty the threads becomes idle/suspended.</p>

<p>&nbsp;</p>
<p align="right">
<script language="JavaScript">
<!--
a1 = "An";a2 = "Ha"; a3 = "dr"; a4 = "us"; a5 = "ea"; a6 = "la"; a7 = "s"; a8 = "de"; a9 = "n"; a10 = "gm"; a11 = "x";
s = a1 + a3 + a5 + a7 + "." + a2 + a4 + a6 + a8 + a9 + "@" + a10 + a11 + ".de";
s2 = a1 + a3 + a5 + a7 + " " + a2 + a4 + a6 + a8 + a9;
b1 = "il"; b2 = "ma"; b3 = "to";
s = b2 + b1 + b3 + ":" + s;
document.write("<a href='" + s + "?subject=AsyncCalls'>" + "(C) 2006-2008 " + s2 + "</a>");
//-->
</script>
</p>

<!--<p align="right">(C) 2006-2008 Andreas Hausladen</p>-->
</body>

⌨️ 快捷键说明

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