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

📄 asynccalls.html

📁 Asyncronous call of delphi functions and procedures.
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<h2>Example</h2>
<div class="code">
<span class="u5">function</span>&nbsp;<span class="u4">TForm1</span><span class="u9">.</span><span class="u4">DoSomething</span><span class="u9">(</span><span class="u4">Value</span><span class="u9">:</span>&nbsp;<span class="u4">TObject</span><span class="u9">):</span>&nbsp;<span class="u4">Integer</span><span class="u9">;</span>
<br><span class="u5">begin</span>
<br>&nbsp;&nbsp;<span class="u4">Result</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u6">0</span><span class="u9">;</span>
<br><span class="u5">end</span><span class="u9">;</span>
<br>
<br><span class="u5">procedure</span>&nbsp;<span class="u4">TForm1</span><span class="u9">.</span><span class="u4">Button3Click</span><span class="u9">(</span><span class="u4">Sender</span><span class="u9">:</span>&nbsp;<span class="u4">TObject</span><span class="u9">);</span>
<br><span class="u5">var</span>
<br>&nbsp;&nbsp;<span class="u4">Value</span><span class="u9">:</span>&nbsp;<span class="u4">Integer</span><span class="u9">;</span>
<br><span class="u5">begin</span>
<br>&nbsp;&nbsp;<span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">Invoke</span><span class="u9">&lt;</span><span class="u4">TObject</span><span class="u9">&gt;(</span><span class="u4">DoSomething</span><span class="u9">,</span>&nbsp;<span class="u5">nil</span><span class="u9">);</span> <span class="u1">// not working in Delphi 2009 due to an internal compiler error</span>
<br>&nbsp;&nbsp;<span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">Invoke</span><span class="u9">&lt;</span><span class="u4">TObject</span><span class="u9">&gt;(</span><span class="u4">DoSomething</span><span class="u9">,</span>&nbsp;<span class="u5">nil</span><span class="u9">);</span> <span class="u1">// not working in Delphi 2009 due to an internal compiler error</span>
<br>
<br>&nbsp;&nbsp;<span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">Invoke</span><span class="u9">(</span><span class="u5">procedure</span>
<br>&nbsp;&nbsp;<span class="u5">begin</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Value</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u6">10</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">VCLInvoke</span><span class="u9">(</span><span class="u5">procedure</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">begin</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">ShowMessage</span><span class="u9">(</span><span class="u8">'The&nbsp;value&nbsp;may&nbsp;not&nbsp;equal&nbsp;10:&nbsp;'</span>&nbsp;<span class="u9">+</span>&nbsp;<span class="u4">IntToStr</span><span class="u9">(</span><span class="u4">Value</span><span class="u9">));</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">end</span><span class="u9">);</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Value</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u6">20</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">VCLSync</span><span class="u9">(</span><span class="u5">procedure</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">begin</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">ShowMessage</span><span class="u9">(</span><span class="u8">'The&nbsp;value&nbsp;equals&nbsp;20:&nbsp;'</span>&nbsp;<span class="u9">+</span>&nbsp;<span class="u4">IntToStr</span><span class="u9">(</span><span class="u4">Value</span><span class="u9">));</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">end</span><span class="u9">);</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Value</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u6">30</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u5">end</span><span class="u9">);</span>
<br>
<br>&nbsp;&nbsp;<span class="u4">Sleep</span><span class="u9">(</span><span class="u6">1000</span><span class="u9">);</span>
<br><span class="u5">end</span><span class="u9">;</span>
</div>
<br />
<div class="code">
<span class="u1">{ The cdecl function GetFiles() has two arguments, a string and an object which are declared like normal arguments. }</span>
<br><span class="u5">procedure</span>&nbsp;<span class="u4">GetFiles</span><span class="u9">(</span><span class="u5">const</span>&nbsp;<span class="u4">Directory</span><span class="u9">:</span>&nbsp;<span class="u5">string</span><span class="u9">;</span>&nbsp;<span class="u4">Filenames</span><span class="u9">:</span>&nbsp;<span class="u4">TStrings</span><span class="u9">);</span>&nbsp;<span class="u5">cdecl</span><span class="u9">;</span>
<br><span class="u5">var</span>
<br>&nbsp;&nbsp;<span class="u4">h</span><span class="u9">:</span>&nbsp;<span class="u4">THandle</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">FindData</span><span class="u9">:</span>&nbsp;<span class="u4">TWin32FindData</span><span class="u9">;</span>
<br><span class="u5">begin</span>
<br>&nbsp;&nbsp;<span class="u4">h</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">FindFirstFile</span><span class="u9">(</span><span class="u4">PChar</span><span class="u9">(</span><span class="u4">Directory</span>&nbsp;<span class="u9">+</span>&nbsp;<span class="u8">'\*.*'</span><span class="u9">),</span>&nbsp;<span class="u4">FindData</span><span class="u9">);</span>
<br>&nbsp;&nbsp;<span class="u5">if</span>&nbsp;<span class="u4">h</span>&nbsp;<span class="u9">&lt;&gt;</span>&nbsp;<span class="u4">INVALID_HANDLE_VALUE</span>&nbsp;<span class="u5">then</span>
<br>&nbsp;&nbsp;<span class="u5">begin</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">repeat</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">if</span>&nbsp;<span class="u9">(</span><span class="u4">StrComp</span><span class="u9">(</span><span class="u4">FindData</span><span class="u9">.</span><span class="u4">cFileName</span><span class="u9">,</span>&nbsp;<span class="u8">'.'</span><span class="u9">)</span>&nbsp;<span class="u9">&lt;&gt;</span>&nbsp;<span class="u6">0</span><span class="u9">)</span>&nbsp;<span class="u5">and</span>&nbsp;<span class="u9">(</span><span class="u4">StrComp</span><span class="u9">(</span><span class="u4">FindData</span><span class="u9">.</span><span class="u4">cFileName</span><span class="u9">,</span>&nbsp;<span class="u8">'..'</span><span class="u9">)</span>&nbsp;<span class="u9">&lt;&gt;</span>&nbsp;<span class="u6">0</span><span class="u9">)</span>&nbsp;<span class="u5">then</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">begin</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Filenames</span><span class="u9">.</span><span class="u4">Add</span><span class="u9">(</span><span class="u4">Directory</span>&nbsp;<span class="u9">+</span>&nbsp;<span class="u8">'\'</span>&nbsp;<span class="u9">+</span>&nbsp;<span class="u4">FindData</span><span class="u9">.</span><span class="u4">cFileName</span><span class="u9">);</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">if</span>&nbsp;<span class="u4">FindData</span><span class="u9">.</span><span class="u4">dwFileAttributes</span>&nbsp;<span class="u5">and</span>&nbsp;<span class="u4">FILE_ATTRIBUTE_DIRECTORY</span>&nbsp;<span class="u9">&lt;&gt;</span>&nbsp;<span class="u6">0</span>&nbsp;<span class="u5">then</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">GetFiles</span><span class="u9">(</span><span class="u4">Filenames</span><span class="u9">[</span><span class="u4">Filenames</span><span class="u9">.</span><span class="u4">Count</span>&nbsp;<span class="u9">-</span>&nbsp;<span class="u6">1</span><span class="u9">],</span>&nbsp;<span class="u4">Filenames</span><span class="u9">);</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">end</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">until</span>&nbsp;<span class="u5">not</span>&nbsp;<span class="u4">FindNextFile</span><span class="u9">(</span><span class="u4">h</span><span class="u9">,</span>&nbsp;<span class="u4">FindData</span><span class="u9">);</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Windows</span><span class="u9">.</span><span class="u4">FindClose</span><span class="u9">(</span><span class="u4">h</span><span class="u9">);</span>
<br>&nbsp;&nbsp;<span class="u5">end</span><span class="u9">;</span>
<br><span class="u5">end</span><span class="u9">;</span>
<br>
<br><span class="u5">procedure</span>&nbsp;<span class="u4">TFormMain</span><span class="u9">.</span><span class="u4">ButtonGetFilesClick</span><span class="u9">(</span><span class="u4">Sender</span><span class="u9">:</span>&nbsp;<span class="u4">TObject</span><span class="u9">);</span>
<br><span class="u5">var</span>
<br>&nbsp;&nbsp;<span class="u4">Dir1</span><span class="u9">,</span>&nbsp;<span class="u4">Dir2</span><span class="u9">,</span>&nbsp;<span class="u4">Dir3</span><span class="u9">:</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">Dir1Files</span><span class="u9">,</span>&nbsp;<span class="u4">Dir2Files</span><span class="u9">,</span>&nbsp;<span class="u4">Dir3Files</span><span class="u9">:</span>&nbsp;<span class="u4">TStrings</span><span class="u9">;</span>
<br><span class="u5">begin</span>
<br>&nbsp;&nbsp;<span class="u4">Dir1Files</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">TStringList</span><span class="u9">.</span><span class="u4">Create</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">Dir2Files</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">TStringList</span><span class="u9">.</span><span class="u4">Create</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">Dir3Files</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">TStringList</span><span class="u9">.</span><span class="u4">Create</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">ButtonGetFiles</span><span class="u9">.</span><span class="u4">Enabled</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">False</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u5">try</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u1">{ Call the cdecl function GetFiles() with two arguments, a string and an object. }</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Dir1</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">AsyncCall</span><span class="u9">(@</span><span class="u4">GetFiles</span><span class="u9">,</span>&nbsp;<span class="u9">[</span><span class="u8">'C:\Windows'</span><span class="u9">,</span>&nbsp;<span class="u4">Dir1Files</span><span class="u9">]);</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u1">{ Call the cdecl function GetFiles() with two arguments, a string and an object. }</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Dir2</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">AsyncCall</span><span class="u9">(@</span><span class="u4">GetFiles</span><span class="u9">,</span>&nbsp;<span class="u9">[</span><span class="u8">'D:\Html'</span><span class="u9">,</span>&nbsp;<span class="u4">Dir2Files</span><span class="u9">]);</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u1">{ Call the cdecl function GetFiles() with two arguments, a string and an object. }</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Dir3</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">AsyncCall</span><span class="u9">(@</span><span class="u4">GetFiles</span><span class="u9">,</span>&nbsp;<span class="u9">[</span><span class="u8">'E:'</span><span class="u9">,</span>&nbsp;<span class="u4">Dir3Files</span><span class="u9">]);</span>
<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u1">{ Wait until both async functions have finished their work. While waiting make the UI reacting on user interaction. }</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">while</span>&nbsp;<span class="u4">AsyncMultiSync</span><span class="u9">([</span><span class="u4">Dir1</span><span class="u9">,</span>&nbsp;<span class="u4">Dir2</span><span class="u9">],</span>&nbsp;<span class="u4">True</span><span class="u9">,</span>&nbsp;<span class="u6">10</span><span class="u9">)</span>&nbsp;<span class="u9">=</span>&nbsp;<span class="u6">WAIT_TIMEOUT</span>&nbsp;<span class="u5">do</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Application</span><span class="u9">.</span><span class="u4">ProcessMessages</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Dir3.Sync<span class="u9">;</span>&nbsp;<span class="u1">// Force the Dir3 function to finish here</span></span>
<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">MemoFiles</span><span class="u9">.</span><span class="u4">Lines</span><span class="u9">.</span><span class="u4">Assign</span><span class="u9">(</span><span class="u4">Dir1Files</span><span class="u9">);</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">MemoFiles</span><span class="u9">.</span><span class="u4">Lines</span><span class="u9">.</span><span class="u4">AddStrings</span><span class="u9">(</span><span class="u4">Dir2Files</span><span class="u9">);</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">MemoFiles</span><span class="u9">.</span><span class="u4">Lines</span><span class="u9">.</span><span class="u4">AddStrings</span><span class="u9">(</span><span class="u4">Dir3Files</span><span class="u9">);</span>
<br>&nbsp;&nbsp;<span class="u5">finally</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">ButtonGetFiles</span><span class="u9">.</span><span class="u4">Enabled</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">True</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Dir3Files</span><span class="u9">.</span><span class="u4">Free</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Dir2Files</span><span class="u9">.</span><span class="u4">Free</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Dir1Files</span><span class="u9">.</span><span class="u4">Free</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u5">end</span><span class="u9">;</span>
<br><span class="u5">end</span><span class="u9">;</span>
</div>

<p>&nbsp;</p>
<hr noshade="noshade">

<h2>IAsyncCall interface</h2>
<p>All AsyncCall functions return an IAsyncCall interface that allows to synchronize the functions.
<div class="code">
&nbsp;&nbsp;<span class="u4">IAsyncCall</span>&nbsp;<span class="u9">=</span>&nbsp;<span class="u5">interface</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">function</span>&nbsp;<span class="u4">Sync</span><span class="u9">:</span>&nbsp;<span class="u4">Integer</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">function</span>&nbsp;<span class="u4">Finished</span><span class="u9">:</span>&nbsp;<span class="u4">Boolean</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">function</span>&nbsp;<span class="u4">ReturnValue</span><span class="u9">:</span>&nbsp;<span class="u4">Integer</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">procedure</span>&nbsp;<span class="u4">ForceDifferentThread</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u5">end</span><span class="u9">;</span>
</div>
<ul>
 <li>The <b>Sync</b> method waits until the function is finished and returns the return value of the function which is
undefined for procedures.
 <li>The <b>Finished</b> method returns True when the asynchron function is finished. Otherwise it returns False.
 <li>The <b>ReturnValue</b> method returns the asynchron function's return value which is undefined for procedures. If
the asynchron function is still executed <b>ReturnValue</b> raises an EAsyncCallError exception.
 <li>The <b>ForceDifferentThread</b> method tells AsyncCalls that the assigned function must
not be executed in the current thread.</li>
</ul>



<p>&nbsp;</p>
<h2>LocalAsyncCall function</h2>
<p>LocalAsyncCall() executes the given local function/procedure in a separate thread.
  The result value of the asynchronous function is returned by IAsyncCall.Sync() and
  IAsyncCall.ReturnValue().<br/>
  The LocalAsyncExec() function calls the IdleMsgMethod while the local procedure is
  executed.</p>
<div class="code">
<span class="u5">function</span>&nbsp;<span class="u4">LocalAsyncCall</span><span class="u9">(</span><span class="u4">LocalProc</span><span class="u9">:</span>&nbsp;<span class="u4">TLocalAsyncProc</span><span class="u9">):</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>
<br><span class="u5">function</span>&nbsp;<span class="u4">LocalAsyncCallEx</span><span class="u9">(</span><span class="u4">LocalProc</span><span class="u9">:</span>&nbsp;<span class="u4">TLocalAsyncProcEx</span><span class="u9">;</span>&nbsp;<span class="u4">Param</span><span class="u9">:</span>&nbsp;<span class="u4">INT_PTR</span><span class="u9">):</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>
<br><span class="u5">procedure</span>&nbsp;<span class="u4">LocalAsyncExec</span><span class="u9">(</span><span class="u4">Proc</span><span class="u9">:</span>&nbsp;<span class="u4">TLocalAsyncProc</span><span class="u9">;</span>&nbsp;<span class="u4">IdleMsgMethod</span><span class="u9">:</span>&nbsp;<span class="u4">TAsyncIdleMsgMethod</span><span class="u9">);</span>
</div>
<ul>
 <li><b>LocalProc</b>: A local function that should be executed asynchron.
</ul>
<h3 class="Example">Example</h3>
<div class="code">
<span class="u5">procedure</span>&nbsp;<span class="u4">MainProc</span><span class="u9">(</span><span class="u5">const</span>&nbsp;<span class="u4">S</span><span class="u9">:</span>&nbsp;<span class="u5">string</span><span class="u9">);</span>
<br><span class="u5">var</span>
<br>&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="u4">a</span><span class="u9">:</span>&nbsp;<span class="u4">IAsyncCall</span><span class="u9">;</span>
<br>
<br>&nbsp;&nbsp;<span class="u5">function</span>&nbsp;<span class="u4">DoSomething</span><span class="u9">:</span>&nbsp;<span class="u4">Integer</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u5">begin</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u5">if</span>&nbsp;<span class="u4">S</span>&nbsp;<span class="u9">=</span>&nbsp;<span class="u8">'Abc'</span>&nbsp;<span class="u5">then</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Value</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u6">1</span><span class="u9">;</span>
<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="u4">Result</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u6">0</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u5">end</span><span class="u9">;</span>
<br>
<br><span class="u5">begin</span>
<br>&nbsp;&nbsp;<span class="u4">a</span>&nbsp;<span class="u9">:=</span>&nbsp;<span class="u4">LocalAsyncCall</span><span class="u9">(@</span><span class="u4">DoSomething</span><span class="u9">);</span>
<br>&nbsp;&nbsp;<span class="u9"></span><span class="u1">//&nbsp;do&nbsp;something</span>
<br>&nbsp;&nbsp;<span class="u4">a</span><span class="u9">.</span><span class="u4">Sync</span><span class="u9">;</span>
<br>&nbsp;&nbsp;<span class="u4">LocalAsyncExec</span><span class="u9">(@</span><span class="u4">DoSomething</span><span class="u9">,</span>&nbsp;<span class="u4">Application</span><span class="u9">.</span><span class="u4">ProcessMessages</span><span class="u9">);</span>
<br><span class="u5">end</span><span class="u9">;</span>
</div>





<p>&nbsp;</p>

⌨️ 快捷键说明

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