問題タブ [omnithreadlibrary]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - キャンセル & 終了ハンドラを使用した ParallelTask (IOmniParallelTask) の適切な構築
ドキュメントを読んだ後、OmniThreadLibrary をいじっているだけですが、ParallelTask の構築に関する簡単な/初期の問題にまだ直面しています。
cancellationToken
とterminationHandler
を使用した ParallelTask の構築後、非同期実行が完了した後に実行さterminationHandler.OnTerminated
れOnStop
ず、理由を見つけることができませんでした:-(
OTL の専門家の何人かが、これについて私を助けてくれることを願っています。
私が達成したいこと:
- 非同期操作を実行する
- キャンセル時に実行を停止 (cancellationtoken)
- 非同期操作が完了すると、メインスレッドでコードを実行します (例外をチェックします)。
私がこれまでにやったこと:
ドキュメントを読んだ後、ParallelTask を作成し、セットアップしcancellationToken
て操作terminationHandler
をTaskConfig
実行しました。実行された操作自体は、cancellationToken
シグナルが送信されていることを確認し、その作業を行います (ここでは 1 のスリープ)。このHandleOnTerminated
メソッドはエラーをチェックし、fIsDone フラグと fHasError フラグを設定して、メインスレッドから読み取ります。
この平和なコードでfIsDone
は、 が設定されることはHandleOnTerminate
ありHandleOnStop
ません。したがって、上記の例では、次の ConsoleApplication が終了しないようです。
delphi - IOmniParallelTask での例外処理が機能しない
実行中の未処理の例外IOmniParallelTask
は、(ドキュメントを理解しているように) OTL によってキャッチされ、インスタンスにアタッチされ、 fromIOmniTaskControl
によってアクセスされる可能性があります。termination handler
IOmniTaskConfig
IOmniParallelTask
したがって、次のようにインスタンスを設定した後termination handler
:
内の未処理の例外TaskToExecute
:
IOmniTaskControl
内で取得したインスタンスにアタッチする必要がありtermination handler
ます。
この時点での問題は、例外が割り当てられておらず、そのIOmniTaskControl.FatalException
理由がわからないことです。
たぶん、あなたの何人かは私が間違っていることについていくつかの考えを持っています. VCL サンプルプロジェクト全体は、https ://github.com/stackoverflow-samples/OTLTaskException にあります。
delphi - OmniThreadLibrary の Parallel.ForEach でのメモリ リーク
私は使用しますOmniThreadLibrary
。並列方式ForEach
です。
高負荷システムで作業しており、いくつかの配列を並行して処理する必要があります。しかし、メモリリークが発生します。
以下にサンプルを示します。
このコードを実行すると、仮想メモリ リークが発生します。
なにが問題ですか?
delphi - OTLパイプラインが入力を封印しないようにするにはどうすればよいですか?
何年も前に古いフォーラムで、私は Primozh に、パイプライン パターンが Uroboros のようなもので、半分完全な結果をそれ自体にフィードバックできるかどうか尋ねました。
当時 Primozh は、それは単純明快で、PipeLine ステージは OmniValues を OUTPUT だけでなく INPUT にもフィードできると述べていました。
問題は、最初のフィード段階があまりにも速く実行され、期限が切れて INPUT コレクションを封印し、それを UN-SEAL する方法がないことです。- OTL が「完了したコレクションに追加できません」という例外をスローします。
では、上記のリンクによるこの自己爆発タスクは、自己給電Pipeline
パターンを介してどのように実装できますか?
UPD: 例を「自己爆発」から変更しました - 膨大な量の中間の半分計算された結果を生成する - 順列の生成から、階乗の単純な (希望する) 計算に変更しました。ただし、これには決定論の欠点があります。常に 1 つの中間ジョブ アイテムが生成されるため、増加するコレクションを処理するパイプラインの機能は試されませんでした。
によって予期せず封印された入力を再入力しようとするパイプライン ステージでクラッシュしTOmniPipeline.Run
ます。マークされた行で、「競合するコレクションに追加できません」という例外が予期せずスローされます。
コレクションが空と少数の間でバランスを取っているときにパイプラインを実行し続ける方法 (それは開始条件であるだけでなく、計算終了近くで繰り返されます)?
少し夢を見る: https://plus.google.com/+AriochThe/posts/LCHnSCmZYtx
もう少し: https://github.com/gabr42/OmniThreadLibrary/issues/61
postgresql - Devart の PgDAC コンポーネントを使用して、Delphi の別のスレッドで PostgreSQL からの NOTICE イベントを処理する
長いクエリを別のスレッドで実行して、それらを中止し、ユーザーにフィードバックを提供したいと考えています。これはすべて機能していますが、OnNotice イベントの処理が正しく行われていないため、アクセス違反が発生することがあります。これを行う適切な方法を知りたいのです。
Delphi 2010 で Devart の PgDAC と OmniThreadLibrary を使用しています。
私が実行する PostgreSQL コードは、次のようなものを含むストアド プロシージャです。
ここに私のコードの興味深い部分があります:
これThreadConnection
は、(別のスレッド内で) クエリを実行するために使用される TPgConnection です。
これが「クエリの中断」ボタンの機能です。メインスレッドで使用されているため、これが非常に「スレッドセーフ」であるかどうかはわかりませんが、クエリ実行スレッド専用の TPgConnection で何かを行います。
これは、スレッドの実行中に発生したエラー (SQL エラーやクエリのキャンセルなど) を表示する場所です。
これが OnNotice イベント処理です。ラベルのキャプションを変更するだけです。
そして、これがクエリの実行方法です。
そのため、PgConnectionNotice
(メイン スレッドで実行されている) イベントは (クエリ実行スレッドで使用されている) に関連付けられておりThreadConnection
、これがランダム アクセス違反を生成していると思われます。
これを処理する方法がわかりません。lock
PgConnectionNotice 内で何らかの種類を使用する必要があります (同期しますか?)。
これは私が試したものです:
PgConnectionNotice (MsgId=2) で送信されたメッセージが で受信されませんOmniEventMonitor1TaskMessage
。
使用してみCalculationTask.Invoke
ましたが、文字列パラメーターを渡すために呼び出す方法がわかりませんでした (Delphi 2010 では無名関数が許可されていないと思います)。
このようにクエリをキャンセルするというより簡単なアクションを試したところ、クエリのキャンセルが停止しました:
だから私は経由で呼び出しを行うべきではないと思いますCalculationTask
。作成したタスクをInternalExecQuery
グローバル変数に保存して使用する必要がありますか?