📄 asynccalls.html
字号:
<br><span class="u5">function</span> <span class="u4">AsyncCallEx</span><span class="u9">(</span><span class="u4">Method</span><span class="u9">:</span> <span class="u4">TAsyncCallArgRecordMethod</span><span class="u9">;</span> <span class="u5">var</span> <span class="u4">Arg</span><span class="u1">{: TRecordType}</span><span class="u9">):</span> <span class="u4">IAsyncCall</span><span class="u9">;</span> <span class="u5">overload</span><span class="u9">;</span>
<br><span class="u5">function</span> <span class="u4">AsyncCallEx</span><span class="u9">(</span><span class="u4">Method</span><span class="u9">:</span> <span class="u4">TAsyncCallArgRecordEvent</span><span class="u9">;</span> <span class="u5">var</span> <span class="u4">Arg</span><span class="u1">{: TRecordType}</span><span class="u9">):</span> <span class="u4">IAsyncCall</span><span class="u9">;</span> <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> <span class="u4">TData</span> <span class="u9">=</span> <span class="u5">record</span>
<br> <span class="u4">Value</span><span class="u9">:</span> <span class="u4">Integer</span><span class="u9">;</span>
<br> <span class="u5">end</span><span class="u9">;</span>
<br>
<br><span class="u5">procedure</span> <span class="u4">TestRec</span><span class="u9">(</span><span class="u5">var</span> <span class="u4">Data</span><span class="u9">:</span> <span class="u4">TData</span><span class="u9">);</span>
<br><span class="u5">begin</span>
<br> <span class="u4">Data</span><span class="u9">.</span><span class="u4">Value</span> <span class="u9">:=</span> <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> <span class="u9">:=</span> <span class="u4">AsyncCallEx</span><span class="u9">(@</span><span class="u4">TestRec</span><span class="u9">,</span> <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> <span class="u1">// MyData.Value is now 70</span>
</div>
<p> </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> <span class="u4">AsyncCall</span><span class="u9">(</span><span class="u4">Proc</span><span class="u9">:</span> <span class="u4">TCdeclFunc</span><span class="u9">;</span> <span class="u5">const</span> <span class="u4">Args</span><span class="u9">:</span> <span class="u5">array</span> <span class="u5">of</span> <span class="u5">const</span><span class="u9">):</span> <span class="u4">IAsyncCall</span><span class="u9">;</span> <span class="u5">overload</span><span class="u9">;</span>
<br><span class="u5">function</span> <span class="u4">AsyncCall</span><span class="u9">(</span><span class="u4">Proc</span><span class="u9">:</span> <span class="u4">TCdeclMethod</span><span class="u9">;</span> <span class="u5">const</span> <span class="u4">Args</span><span class="u9">:</span> <span class="u5">array</span> <span class="u5">of</span> <span class="u5">const</span><span class="u9">):</span> <span class="u4">IAsyncCall</span><span class="u9">;</span> <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> </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> <span class="u4">AsyncMultiSync</span><span class="u9">(</span><span class="u5">const</span> <span class="u4">List</span><span class="u9">:</span> <span class="u5">array</span> <span class="u5">of</span> <span class="u4">IAsyncCall</span><span class="u9">;</span> <span class="u4">WaitAll</span><span class="u9">:</span> <span class="u4">Boolean</span> <span class="u9">=</span> <span class="u4">True</span><span class="u9">;</span>
<br> <span class="u4">Milliseconds</span><span class="u9">:</span> <span class="u4">Cardinal</span> <span class="u9">=</span> <span class="u4">INFINITE</span><span class="u9">):</span> <span class="u4">Cardinal</span><span class="u9">;</span>
<br><span class="u5">function</span> <span class="u4">AsyncMultiSyncEx</span><span class="u9">(</span><span class="u5">const</span> <span class="u4">List</span><span class="u9">:</span> <span class="u5">array</span> <span class="u5">of</span> <span class="u4">IAsyncCall</span><span class="u9">;</span> <span class="u5">const</span> <span class="u4">Handles</span><span class="u9">:</span> <span class="u5">array</span> <span class="u5">of</span> <span class="u4">THandle</span><span class="u9">;</span>
<br> <span class="u4">WaitAll</span><span class="u9">:</span> <span class="u4">Boolean</span> <span class="u9">=</span> <span class="u4">True</span><span class="u9">;</span> <span class="u4">Milliseconds</span><span class="u9">:</span> <span class="u4">Cardinal</span> <span class="u9">=</span> <span class="u4">INFINITE</span><span class="u9">):</span> <span class="u4">Cardinal</span><span class="u9">;</span>
<br><span class="u5">function</span> <span class="u4">MsgAsyncMultiSync</span><span class="u9">(</span><span class="u5">const</span> <span class="u4">List</span><span class="u9">:</span> <span class="u5">array</span> <span class="u5">of</span> <span class="u4">IAsyncCall</span><span class="u9">;</span> <span class="u4">WaitAll</span><span class="u9">:</span> <span class="u4">Boolean</span><span class="u9">;</span>
<br> <span class="u4">Milliseconds</span><span class="u9">:</span> <span class="u4">Cardinal</span><span class="u9">;</span> <span class="u4">dwWakeMask</span><span class="u9">:</span> <span class="u4">DWORD</span><span class="u9">):</span> <span class="u4">Cardinal</span><span class="u9">;</span>
<br><span class="u5">function</span> <span class="u4">MsgAsyncMultiSyncEx</span><span class="u9">(</span><span class="u5">const</span> <span class="u4">List</span><span class="u9">:</span> <span class="u5">array</span> <span class="u5">of</span> <span class="u4">IAsyncCall</span><span class="u9">;</span> <span class="u5">const</span> <span class="u4">Handles</span><span class="u9">:</span> <span class="u5">array</span> <span class="u5">of</span> <span class="u4">THandle</span><span class="u9">;</span>
<br> <span class="u4">WaitAll</span><span class="u9">:</span> <span class="u4">Boolean</span><span class="u9">;</span> <span class="u4">Milliseconds</span><span class="u9">:</span> <span class="u4">Cardinal</span><span class="u9">;</span> <span class="u4">dwWakeMask</span><span class="u9">:</span> <span class="u4">DWORD</span><span class="u9">):</span> <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> (61 elements).</p></blockquote>
<h3>Return value</h3>
<blockquote>
<ul>
<li><b>WAIT_TIMEOUT</b><br/>
The function timed out<br/> </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/> </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/> </li>
<li><b>WAIT_FAILED</b><br/>
The function failed</li>
</ul>
</blockquote>
</blockquote>
<p> </p>
<hr noshade="noshade">
<p> </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> </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 + -