📄 asynccalls.html
字号:
<h2>Example</h2>
<div class="code">
<span class="u5">function</span> <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> <span class="u4">TObject</span><span class="u9">):</span> <span class="u4">Integer</span><span class="u9">;</span>
<br><span class="u5">begin</span>
<br> <span class="u4">Result</span> <span class="u9">:=</span> <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> <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> <span class="u4">TObject</span><span class="u9">);</span>
<br><span class="u5">var</span>
<br> <span class="u4">Value</span><span class="u9">:</span> <span class="u4">Integer</span><span class="u9">;</span>
<br><span class="u5">begin</span>
<br> <span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">Invoke</span><span class="u9"><</span><span class="u4">TObject</span><span class="u9">>(</span><span class="u4">DoSomething</span><span class="u9">,</span> <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> <span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">Invoke</span><span class="u9"><</span><span class="u4">TObject</span><span class="u9">>(</span><span class="u4">DoSomething</span><span class="u9">,</span> <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> <span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">Invoke</span><span class="u9">(</span><span class="u5">procedure</span>
<br> <span class="u5">begin</span>
<br> <span class="u4">Value</span> <span class="u9">:=</span> <span class="u6">10</span><span class="u9">;</span>
<br> <span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">VCLInvoke</span><span class="u9">(</span><span class="u5">procedure</span>
<br> <span class="u5">begin</span>
<br> <span class="u4">ShowMessage</span><span class="u9">(</span><span class="u8">'The value may not equal 10: '</span> <span class="u9">+</span> <span class="u4">IntToStr</span><span class="u9">(</span><span class="u4">Value</span><span class="u9">));</span>
<br> <span class="u5">end</span><span class="u9">);</span>
<br> <span class="u4">Value</span> <span class="u9">:=</span> <span class="u6">20</span><span class="u9">;</span>
<br> <span class="u4">TAsyncCalls</span><span class="u9">.</span><span class="u4">VCLSync</span><span class="u9">(</span><span class="u5">procedure</span>
<br> <span class="u5">begin</span>
<br> <span class="u4">ShowMessage</span><span class="u9">(</span><span class="u8">'The value equals 20: '</span> <span class="u9">+</span> <span class="u4">IntToStr</span><span class="u9">(</span><span class="u4">Value</span><span class="u9">));</span>
<br> <span class="u5">end</span><span class="u9">);</span>
<br> <span class="u4">Value</span> <span class="u9">:=</span> <span class="u6">30</span><span class="u9">;</span>
<br> <span class="u5">end</span><span class="u9">);</span>
<br>
<br> <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> <span class="u4">GetFiles</span><span class="u9">(</span><span class="u5">const</span> <span class="u4">Directory</span><span class="u9">:</span> <span class="u5">string</span><span class="u9">;</span> <span class="u4">Filenames</span><span class="u9">:</span> <span class="u4">TStrings</span><span class="u9">);</span> <span class="u5">cdecl</span><span class="u9">;</span>
<br><span class="u5">var</span>
<br> <span class="u4">h</span><span class="u9">:</span> <span class="u4">THandle</span><span class="u9">;</span>
<br> <span class="u4">FindData</span><span class="u9">:</span> <span class="u4">TWin32FindData</span><span class="u9">;</span>
<br><span class="u5">begin</span>
<br> <span class="u4">h</span> <span class="u9">:=</span> <span class="u4">FindFirstFile</span><span class="u9">(</span><span class="u4">PChar</span><span class="u9">(</span><span class="u4">Directory</span> <span class="u9">+</span> <span class="u8">'\*.*'</span><span class="u9">),</span> <span class="u4">FindData</span><span class="u9">);</span>
<br> <span class="u5">if</span> <span class="u4">h</span> <span class="u9"><></span> <span class="u4">INVALID_HANDLE_VALUE</span> <span class="u5">then</span>
<br> <span class="u5">begin</span>
<br> <span class="u5">repeat</span>
<br> <span class="u5">if</span> <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> <span class="u8">'.'</span><span class="u9">)</span> <span class="u9"><></span> <span class="u6">0</span><span class="u9">)</span> <span class="u5">and</span> <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> <span class="u8">'..'</span><span class="u9">)</span> <span class="u9"><></span> <span class="u6">0</span><span class="u9">)</span> <span class="u5">then</span>
<br> <span class="u5">begin</span>
<br> <span class="u4">Filenames</span><span class="u9">.</span><span class="u4">Add</span><span class="u9">(</span><span class="u4">Directory</span> <span class="u9">+</span> <span class="u8">'\'</span> <span class="u9">+</span> <span class="u4">FindData</span><span class="u9">.</span><span class="u4">cFileName</span><span class="u9">);</span>
<br> <span class="u5">if</span> <span class="u4">FindData</span><span class="u9">.</span><span class="u4">dwFileAttributes</span> <span class="u5">and</span> <span class="u4">FILE_ATTRIBUTE_DIRECTORY</span> <span class="u9"><></span> <span class="u6">0</span> <span class="u5">then</span>
<br> <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> <span class="u9">-</span> <span class="u6">1</span><span class="u9">],</span> <span class="u4">Filenames</span><span class="u9">);</span>
<br> <span class="u5">end</span><span class="u9">;</span>
<br> <span class="u5">until</span> <span class="u5">not</span> <span class="u4">FindNextFile</span><span class="u9">(</span><span class="u4">h</span><span class="u9">,</span> <span class="u4">FindData</span><span class="u9">);</span>
<br> <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> <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> <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> <span class="u4">TObject</span><span class="u9">);</span>
<br><span class="u5">var</span>
<br> <span class="u4">Dir1</span><span class="u9">,</span> <span class="u4">Dir2</span><span class="u9">,</span> <span class="u4">Dir3</span><span class="u9">:</span> <span class="u4">IAsyncCall</span><span class="u9">;</span>
<br> <span class="u4">Dir1Files</span><span class="u9">,</span> <span class="u4">Dir2Files</span><span class="u9">,</span> <span class="u4">Dir3Files</span><span class="u9">:</span> <span class="u4">TStrings</span><span class="u9">;</span>
<br><span class="u5">begin</span>
<br> <span class="u4">Dir1Files</span> <span class="u9">:=</span> <span class="u4">TStringList</span><span class="u9">.</span><span class="u4">Create</span><span class="u9">;</span>
<br> <span class="u4">Dir2Files</span> <span class="u9">:=</span> <span class="u4">TStringList</span><span class="u9">.</span><span class="u4">Create</span><span class="u9">;</span>
<br> <span class="u4">Dir3Files</span> <span class="u9">:=</span> <span class="u4">TStringList</span><span class="u9">.</span><span class="u4">Create</span><span class="u9">;</span>
<br> <span class="u4">ButtonGetFiles</span><span class="u9">.</span><span class="u4">Enabled</span> <span class="u9">:=</span> <span class="u4">False</span><span class="u9">;</span>
<br> <span class="u5">try</span>
<br> <span class="u1">{ Call the cdecl function GetFiles() with two arguments, a string and an object. }</span>
<br> <span class="u4">Dir1</span> <span class="u9">:=</span> <span class="u4">AsyncCall</span><span class="u9">(@</span><span class="u4">GetFiles</span><span class="u9">,</span> <span class="u9">[</span><span class="u8">'C:\Windows'</span><span class="u9">,</span> <span class="u4">Dir1Files</span><span class="u9">]);</span>
<br> <span class="u1">{ Call the cdecl function GetFiles() with two arguments, a string and an object. }</span>
<br> <span class="u4">Dir2</span> <span class="u9">:=</span> <span class="u4">AsyncCall</span><span class="u9">(@</span><span class="u4">GetFiles</span><span class="u9">,</span> <span class="u9">[</span><span class="u8">'D:\Html'</span><span class="u9">,</span> <span class="u4">Dir2Files</span><span class="u9">]);</span>
<br> <span class="u1">{ Call the cdecl function GetFiles() with two arguments, a string and an object. }</span>
<br> <span class="u4">Dir3</span> <span class="u9">:=</span> <span class="u4">AsyncCall</span><span class="u9">(@</span><span class="u4">GetFiles</span><span class="u9">,</span> <span class="u9">[</span><span class="u8">'E:'</span><span class="u9">,</span> <span class="u4">Dir3Files</span><span class="u9">]);</span>
<br>
<br> <span class="u1">{ Wait until both async functions have finished their work. While waiting make the UI reacting on user interaction. }</span>
<br> <span class="u5">while</span> <span class="u4">AsyncMultiSync</span><span class="u9">([</span><span class="u4">Dir1</span><span class="u9">,</span> <span class="u4">Dir2</span><span class="u9">],</span> <span class="u4">True</span><span class="u9">,</span> <span class="u6">10</span><span class="u9">)</span> <span class="u9">=</span> <span class="u6">WAIT_TIMEOUT</span> <span class="u5">do</span>
<br> <span class="u4">Application</span><span class="u9">.</span><span class="u4">ProcessMessages</span><span class="u9">;</span>
<br> <span class="u4">Dir3.Sync<span class="u9">;</span> <span class="u1">// Force the Dir3 function to finish here</span></span>
<br>
<br> <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> <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> <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> <span class="u5">finally</span>
<br> <span class="u4">ButtonGetFiles</span><span class="u9">.</span><span class="u4">Enabled</span> <span class="u9">:=</span> <span class="u4">True</span><span class="u9">;</span>
<br> <span class="u4">Dir3Files</span><span class="u9">.</span><span class="u4">Free</span><span class="u9">;</span>
<br> <span class="u4">Dir2Files</span><span class="u9">.</span><span class="u4">Free</span><span class="u9">;</span>
<br> <span class="u4">Dir1Files</span><span class="u9">.</span><span class="u4">Free</span><span class="u9">;</span>
<br> <span class="u5">end</span><span class="u9">;</span>
<br><span class="u5">end</span><span class="u9">;</span>
</div>
<p> </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">
<span class="u4">IAsyncCall</span> <span class="u9">=</span> <span class="u5">interface</span>
<br> <span class="u5">function</span> <span class="u4">Sync</span><span class="u9">:</span> <span class="u4">Integer</span><span class="u9">;</span>
<br> <span class="u5">function</span> <span class="u4">Finished</span><span class="u9">:</span> <span class="u4">Boolean</span><span class="u9">;</span>
<br> <span class="u5">function</span> <span class="u4">ReturnValue</span><span class="u9">:</span> <span class="u4">Integer</span><span class="u9">;</span>
<br> <span class="u5">procedure</span> <span class="u4">ForceDifferentThread</span><span class="u9">;</span>
<br> <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> </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> <span class="u4">LocalAsyncCall</span><span class="u9">(</span><span class="u4">LocalProc</span><span class="u9">:</span> <span class="u4">TLocalAsyncProc</span><span class="u9">):</span> <span class="u4">IAsyncCall</span><span class="u9">;</span>
<br><span class="u5">function</span> <span class="u4">LocalAsyncCallEx</span><span class="u9">(</span><span class="u4">LocalProc</span><span class="u9">:</span> <span class="u4">TLocalAsyncProcEx</span><span class="u9">;</span> <span class="u4">Param</span><span class="u9">:</span> <span class="u4">INT_PTR</span><span class="u9">):</span> <span class="u4">IAsyncCall</span><span class="u9">;</span>
<br><span class="u5">procedure</span> <span class="u4">LocalAsyncExec</span><span class="u9">(</span><span class="u4">Proc</span><span class="u9">:</span> <span class="u4">TLocalAsyncProc</span><span class="u9">;</span> <span class="u4">IdleMsgMethod</span><span class="u9">:</span> <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> <span class="u4">MainProc</span><span class="u9">(</span><span class="u5">const</span> <span class="u4">S</span><span class="u9">:</span> <span class="u5">string</span><span class="u9">);</span>
<br><span class="u5">var</span>
<br> <span class="u4">Value</span><span class="u9">:</span> <span class="u4">Integer</span><span class="u9">;</span>
<br> <span class="u4">a</span><span class="u9">:</span> <span class="u4">IAsyncCall</span><span class="u9">;</span>
<br>
<br> <span class="u5">function</span> <span class="u4">DoSomething</span><span class="u9">:</span> <span class="u4">Integer</span><span class="u9">;</span>
<br> <span class="u5">begin</span>
<br> <span class="u5">if</span> <span class="u4">S</span> <span class="u9">=</span> <span class="u8">'Abc'</span> <span class="u5">then</span>
<br> <span class="u4">Value</span> <span class="u9">:=</span> <span class="u6">1</span><span class="u9">;</span>
<br> <span class="u4">Result</span> <span class="u9">:=</span> <span class="u6">0</span><span class="u9">;</span>
<br> <span class="u5">end</span><span class="u9">;</span>
<br>
<br><span class="u5">begin</span>
<br> <span class="u4">a</span> <span class="u9">:=</span> <span class="u4">LocalAsyncCall</span><span class="u9">(@</span><span class="u4">DoSomething</span><span class="u9">);</span>
<br> <span class="u9"></span><span class="u1">// do something</span>
<br> <span class="u4">a</span><span class="u9">.</span><span class="u4">Sync</span><span class="u9">;</span>
<br> <span class="u4">LocalAsyncExec</span><span class="u9">(@</span><span class="u4">DoSomething</span><span class="u9">,</span> <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> </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -