問題タブ [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.

0 投票する
1 に答える
239 参照

delphi - キャンセル & 終了ハンドラを使用した ParallelTask​​ (IOmniParallelTask​​) の適切な構築

ドキュメントを読んだ後、OmniThreadLibrary をいじっているだけですが、ParallelTask​​ の構築に関する簡単な/初期の問題にまだ直面しています。

cancellationTokenterminationHandlerを使用した ParallelTask​​ の構築後、非同期実行が完了した後に実行さterminationHandler.OnTerminatedOnStopず、理由を見つけることができませんでした:-(

OTL の専門家の何人かが、これについて私を助けてくれることを願っています。

私が達成したいこと:

  • 非同期操作を実行する
  • キャンセル時に実行を停止 (cancellationtoken)
  • 非同期操作が完了すると、メインスレッドでコードを実行します (例外をチェックします)。

私がこれまでにやったこと

ドキュメントを読んだ後、ParallelTask​​ を作成し、セットアップしcancellationTokenて操作terminationHandlerTaskConfig実行しました。実行された操作自体は、cancellationTokenシグナルが送信されていることを確認し、その作業を行います (ここでは 1 のスリープ)。このHandleOnTerminatedメソッドはエラーをチェックし、fIsDone フラグと fHasError フラグを設定して、メインスレッドから読み取ります。

この平和なコードでfIsDoneは、 が設定されることはHandleOnTerminateありHandleOnStopません。したがって、上記の例では、次の ConsoleApplication が終了しないようです。

0 投票する
1 に答える
172 参照

delphi - IOmniParallelTask​​ での例外処理が機能しない

実行中の未処理の例外IOmniParallelTaskは、(ドキュメントを理解しているように) OTL によってキャッチされ、インスタンスにアタッチされ、 fromIOmniTaskControlによってアクセスされる可能性があります。termination handlerIOmniTaskConfig

IOmniParallelTaskしたがって、次のようにインスタンスを設定した後termination handler

内の未処理の例外TaskToExecute:

IOmniTaskControl内で取得したインスタンスにアタッチする必要がありtermination handlerます。

この時点での問題は、例外割り当てられておらず、そのIOmniTaskControl.FatalException理由がわからないことです。

たぶん、あなたの何人かは私が間違っていることについていくつかの考えを持っています. VCL サンプルプロジェクト全体は、https ://github.com/stackoverflow-samples/OTLTaskException にあります。

0 投票する
0 に答える
264 参照

delphi - OmniThreadLibrary の Parallel.ForEach でのメモリ リーク

私は使用しますOmniThreadLibrary。並列方式ForEachです。

高負荷システムで作業しており、いくつかの配列を並行して処理する必要があります。しかし、メモリリークが発生します。

以下にサンプルを示します。

このコードを実行すると、仮想メモリ リークが発生します。

なにが問題ですか?

0 投票する
1 に答える
247 参照

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

0 投票する
1 に答える
365 参照

postgresql - Devart の PgDAC コンポーネントを使用して、Delphi の別のスレッドで PostgreSQL からの NOTICE イベントを処理する

長いクエリを別のスレッドで実行して、それらを中止し、ユーザーにフィードバックを提供したいと考えています。これはすべて機能していますが、OnNotice イベントの処理が正しく行われていないため、アクセス違反が発生することがあります。これを行う適切な方法を知りたいのです。

Delphi 2010 で Devart の PgDAC と OmniThreadLibrary を使用しています。

私が実行する PostgreSQL コードは、次のようなものを含むストアド プロシージャです。

ここに私のコードの興味深い部分があります:

これThreadConnectionは、(別のスレッド内で) クエリを実行するために使用される TPgConnection です。

これが「クエリの中断」ボタンの機能です。メインスレッドで使用されているため、これが非常に「スレッドセーフ」であるかどうかはわかりませんが、クエリ実行スレッド専用の TPgConnection で何かを行います。

これは、スレッドの実行中に発生したエラー (SQL エラーやクエリのキャンセルなど) を表示する場所です。

これが OnNotice イベント処理です。ラベルのキャプションを変更するだけです。

そして、これがクエリの実行方法です。

そのため、PgConnectionNotice(メイン スレッドで実行されている) イベントは (クエリ実行スレッドで使用されている) に関連付けられておりThreadConnection、これがランダム アクセス違反を生成していると思われます。

これを処理する方法がわかりません。lockPgConnectionNotice 内で何らかの種類を使用する必要があります (同期しますか?)。

これは私が試したものです:

PgConnectionNotice (MsgId=2) で送信されたメッセージが で受信されませんOmniEventMonitor1TaskMessage

使用してみCalculationTask.Invokeましたが、文字列パラメーターを渡すために呼び出す方法がわかりませんでした (Delphi 2010 では無名関数が許可されていないと思います)。

このようにクエリをキャンセルするというより簡単なアクションを試したところ、クエリのキャンセルが停止しました:

だから私は経由で呼び出しを行うべきではないと思いますCalculationTask。作成したタスクをInternalExecQueryグローバル変数に保存して使用する必要がありますか?