Delphiで関数またはプロシージャを非同期に実行しようとしていますが、コンポーネントを使用しないで、delphiのコア関数を使用する方法はありますか?Delphiで関数/プロシージャを非同期に呼び出す方法(コンポーネントなし)
答えて
スレッド上でプロシージャを実行することもできます。 OnTerminateイベントを使用して結果を取得します。確かに、.NETやC#の今日では、非同期的にメソッドを実行する簡単で便利な方法がありますが、それがDelphiで動作する方法です。
VCLのなかにlike BeginInvoke in .NETがあるかどうかを確認するには、答えはいいえです。しかし、あなたはあなたのプログラムにリンクする小さなユニット、Andreas HausladenのAsyncCallsライブラリの形でかなり似たものを得ることができます。それはコンポーネントではないので、私はそれが適格であると思う。また、バージョン5以降のDelphiもサポートしています。非常にお勧めします。
編集:
あなたはそれが実行して取得していないので、私は例を追加します。呼び出し元コードでブロックすると、関数が返されたIAsyncCall
インターフェイスポインタへの参照が保持されないという問題があります。したがって、インタフェースを実装しているオブジェクトは、一時参照が範囲外になるとすぐに破棄されます。デストラクタはVCLスレッドのコンテキストで呼び出され、WaitForSingleObject()
または同様の関数を呼び出して、ワーカースレッドが終了するのを待機します。その結果、VCLスレッドがブロックされます。
あなたがインターフェイスポインタへの参照を維持場合は、正しい動作を取得します:無効にし、それはInterval
非常に短くてみましょうするためにタイマーを設定し
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
fAsyncCall: IAsyncCall;
procedure WaitForIt(ADelay: integer);
end;
を、50ミリ秒と言います。ボタンをクリックすると、非同期操作が開始されます。
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := FALSE;
fAsyncCall := AsyncCall(WaitForIt, 1000);
end;
procedure TForm1.WaitForIt(ADelay: integer);
begin
Sleep(ADelay);
EnterMainThread;
try
Randomize;
Color := RGB(Random(256), Random(256), Random(256));
Timer1.Enabled := TRUE;
finally
LeaveMainThread;
end;
end;
この操作がアクティブな間は、他の操作は開始できません。 EnterMainThread()
とLeaveMainThread()
を使用して、呼び出されたメソッドから直接フォームにアクセスすることも可能である方法
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := FALSE;
Assert((fAsyncCall <> nil) and fAsyncCall.Finished);
fAsyncCall := nil;
Button1.Enabled := TRUE;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := (fAsyncCall = nil) or fAsyncCall.Finished;
end;
注完了時に、それは、フォームに通知し、インタフェースリファレンスをリセットするタイマーを可能にします。
上記のコードは絶対的な最小値ではなく、いくつかのアイデアを示すことを目的としています。
私はそのライブラリを昨日見ましたが、私はコードを最小限に抑えたかったので、とにかくそれを使用することになります。それは単純な.pas単位の権利ですか? – Sebastian
はい、それは2〜3のkLOCの間でしかありませんので、既にごくわずかです。私はこれが勝てるとは思わない。インターフェイスは非常に簡単です。全ての毛深いものは 'implementation'部分にあります;-)呼び出しが終了するまで' IAsyncCall'参照を保持してください。そうしないと、最後の参照カウントの減少がブロックされます。 – mghie
これは最高の解決策になるようです。どうもありがとうございます。 – Sebastian
- 1. vbaで非同期関数呼び出しを行う方法
- 2. 非同期関数呼び出し
- 3. 非同期呼び出しで同期関数をラップする#
- 4. ジェネレータ(非同期)関数をインターバルベースで呼び出す方法
- 5. anglejsのhtmlで非同期関数を呼び出す方法
- 6. 私は非同期関数xamarinを呼び出す方法
- 7. 同期関数への非同期呼び出し
- 8. 素早くシングルトンで非同期関数を呼び出す適切な方法
- 9. 返信のある関数で非同期呼び出しを呼び出す
- 10. 非同期呼び出しを同期化する方法
- 11. 非同期呼び出しで同期変数を追跡する方法
- 12. Knockout.js非同期呼び出し関数が動作しない
- 13. jQuery非同期関数呼び出し、AJAX要求なし
- 14. 内部のネイティブ呼び出し関数.then非同期関数
- 15. exec()で動的に非同期関数を呼び出す
- 16. バグ修正! (同期関数内で非同期関数を呼び出す方法)
- 17. 非同期呼び出し
- 18. 非同期に非同期デリゲートを呼び出しますか?
- 19. 状態の更新後に非同期関数を呼び出す方法は?
- 20. ループ内で非同期関数を呼び出す
- 21. メインファイルで非同期関数を呼び出す
- 22. nodejs非同期呼び出しに明示的な引数を渡す方法
- 23. ASP.NET Webフォーム - 非同期的にWCF非同期メソッドを呼び出す方法
- 24. mockitoで非同期呼び出しをスタブする方法は?
- 25. AWSラムダ関数を同期的に呼び出す方法は?
- 26. React-Nativeで非同期関数内で非同期関数を呼び出す - Firebase
- 27. パラメータを使用した非同期呼び出しの呼び出し方法
- 28. 非同期前に関数を呼び出す関数非同期の前に機能
- 29. Swift + iOS:非同期呼び出しからクロージャを呼び出す方法は?
- 30. 非同期に非同期にPython呼び出しリモートオブジェクトメソッド
私はC#jejeで何をしているのですか?今、私はdelphiに翻訳しようとしています(.NETを使いたくないので)。ありがとう。 – Sebastian
私は結局、単純なBeginThreadだけで作業しました。私は実際に手続きの結果を気にしません。何かをやるかExitをしなければなりません。あなたのmsgに感謝します。 – Sebastian