問題タブ [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 - Delphi xe2 で OTL から parallel.foreach を終了する方法
Delphi XE2 で OmniThreadLibrary を使用する方法を学んでいます。
キャンセル トークンを使用する必要があると読みましたが、その使用方法に関する例が見つかりません。
これは、関数内の元の for ループです。
そして、これが私が Parallel.ForEach を使用している方法です
Parallel.ForEach の内部は、プロシージャ内でキャプチャされていないため実行できません。Result := 'ERROR'
そのため、Parallel.ForEach をキャンセルしてそのキャンセルを報告できれば、Result := 'ERROR'
外部に割り当てるだけでよいと思います。
しかし、私は OmniThreadLibrary を初めて使用し、そのようなことを行う方法がわかりません。助けてください :)
multithreading - OmniThreadLibrary を使用した配列への並列書き込みは、シリアル書き込みより遅い
私は差分進化最適化アルゴリズムの実装に取り組んでおり、母集団メンバーを並行して計算することで計算時間を短縮したいと考えています。私は OmniThread ライブラリを使用しており、ループの並列化に成功しましたが、シリアル実装よりも遅いことがわかりました。
並列化をテストするためにコードを本質的に縮小しましたが、縮小バージョンでも同じ問題が発生します。並列バージョンはシリアル バージョンよりも低速です。
重要なのは、母集団のメンバーごとに出力を書き込む複数の動的配列を渡すことです。各配列には母集団メンバー専用の次元が 1 つあるため、母集団メンバーごとに異なる配列インデックスのセットがアクセスされます。これは、並列実装では、2 つのスレッドが同じ配列要素に書き込むことはないことも意味します。
テストに使用したコードの下 (差分進化の実際のコードには、DoWork
さらに多くのconst
パラメーターとvar
配列を持つプロシージャーがあります)
8 コア プロセッサで約 x6 の速度向上を期待していましたが、わずかな速度低下に直面しました。DoWork
プロシージャを並行して実行することでスピードアップするには、何を変更すればよいですか?
DoWork
メンテナンスを容易にするためにコードの本体を共有しながら、並列化 (ブール値フラグ) の有無にかかわらず同じアルゴリズムを呼び出すことができる必要があるため、実際の作業はプロシージャ内に保持することをお勧めします。
delphi - OTL でこのエラーが発生するのはなぜですか?
初めて OTL を使用していますが、Async/Await 抽象化を使用しようとしていました。
さて、何が起こるかを確認するためだけに小さなプログラムを作成しました。これは単なるボタンであり、このプロシージャを呼び出します。
初挑戦
このため、最初は正常に機能し、ボタンを無効にし、非同期のためにスリープしてから有効に戻します。
しかし、ボタンを 2 回目にクリックすると無効になりますが、再び有効になることはありません。
2 回目の試行
今回はメッセージを100回表示したかったのですが、1回目はうまくいきましたが、もう一度プロシージャを呼び出すと、次のエラーが発生しますTOminCommunicationEndpoint.Send: Queue is full
このライブラリを使用したことがある人は、なぜこのエラーが発生するのか説明してもらえますか? そして、それが最初の試行の問題に関連している場合は?
delphi - OTL を使用してネストされたループを並列化できますか?
OTL を使用してこのループを並列化できるかどうか疑問に思っていました。
次のコードがあります。
GridMat (SDL_matrix.TMatrix から) をパラメーターとしてすべての並列 ForEach に渡し、それに値を追加することは可能ですか?
delphi - IOmniThreadPool を使用する次のコードでアクセス違反が発生するのはなぜですか?
Delphi XE4 アプリケーションでは、特定の計算の効率を向上させるために、MaxExecuting=4 で OmniThreadPool を使用しています。残念ながら、断続的なアクセス違反で問題が発生しています (たとえば、次の MadExcept バグ レポートhttp://ec2-72-44-42-247.compute-1.amazonaws.com/BugReport.txtを参照してください)。問題を示す次の例を作成できました。次のコンソール アプリケーションを実行した後、System.SyncObjs.TCriticalSection.Acquire で通常 1 分ほどでアクセス違反が発生します。次のコードで私が間違っていることを誰かに教えてもらえますか、または望ましい結果を達成する別の方法を教えてもらえますか?
multithreading - TOmniEventMonitor はバックグラウンド スレッドで使用できますか?
元の質問
Delphi XE4 アプリケーションでは、TOmniEventMonitor を使用して他のタスクからメッセージを受信します。これがメイン スレッドで実行されている限り、正常に動作しますが、同じコードをタスクに配置すると、TOmniEventMonitor はメッセージの受信を停止します。以下に簡単な例を示します。Button_TestInMainThread をクリックするとファイルが期待どおりに書き込まれますが、Button_TestInBackgroundThread をクリックすると書き込まれません。これは仕様によるものですか、それとも TOmniEventMonitor を使用している間にこれを機能させる方法はありますか?
追加の観察
次のコードでは、バックグラウンド スレッド内で TOmniEventMonitor を正常に使用できるようです。これは非常に不器用な解決策です。IOmniTwoWayChannel は作成されますが、意味のある方法では使用されません。もう呼ばれません。ここで私が間違っていることを誰かに教えてもらえますか?
delphi - BackgroundWorker の TOmniValue 配列で文字列を使用するとエラーが発生します
TOmniValue 配列に文字列がある場合、名前または明示的なインデックスで値にアクセスすると、アクセス違反が発生します。例については、次のコードを参照してください。何か間違ったことをしていますか、それとも Delphi または TOmniValue にエラーがありますか? インデックスによるアクセスの回避策を見つけましたが、名前によるアクセスはどうでしょうか。
更新: 簡単に再現できるように Test をコンソール アプリに移動しましたが、エラーはすべての反復ではなく、2 回ごとの実行でのみ発生します。それとも、今は同じエラーでさえないのでしょうか?
Otl (r1333) の最新のトランクを使用しています。3.03a でも同じエラーが発生したと思います。
delphi - TOmniValue が名前の長さが 1 に等しい名前付きの値を受け入れないのはなぜですか?
次のプログラムでは、 の実行時にエラーが発生しますTOmniValue.CreateNamed
。
例外はException
メッセージ付きのタイプです:
TOmniValue.CreateNamed: 無効な名前タイプ
名前の長さが 1 文字を超える場合、コードはエラーなしで実行され、期待される出力が報告されます。
私のコードに問題がありますか、それともライブラリに問題がありますか?