問題タブ [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でfor-down-toループを並列にコーディングし、リストをアクティブにして、アイテムを削除する方法は?
たとえば、次のコードを見てください。
たとえば、OmniThreadLibrary を使用してこれをどのように並列化しますか? 出来ますか?それとも再構築する必要がありますか?
は大きく、各反復で使用した後にアイテムを解放することは、メモリ使用量を最小限に抑えるために重要であるため、myStringList.Delete(i);
各反復で呼び出しています。StringList
delphi - スレッドの実行中にフォームへのすべての着信メッセージをブロックする方法
私は現在のシナリオを持っています.imは、次のような一般的なバックグラウンド作業にomnithreadlibraryを使用しています:
したがって、実行を開始する前に、次のようにインターフェイスをブロックします。
スレッドが終了したら、次のようにブロックを解放します。
注: TPresentationFormWorker は、ビジー状態のフォームに入れたアニメーション フォームです。
問題は、フォームを無効にした後でもスレッドの実行が「ビジー」な場合でも、フォームとやり取りできることです。次に例を示します。
- 私は任意のボタンをクリックすることができ、スレッドが実行を終了すると、ボタンのアクションがトリガーされます。
- 私は任意のコントロールに入力できます。たとえば、意味のない情報を編集し、スレッドが実行を終了すると、コントロールに提供したコンテンツは以前に消去されます (ui ロールバック? 笑)。
私の推測では、スレッドが application.processmessages のおかげで機能している間、フォームを無効にするために行ったやり取りがキューに送信され、スレッドが終了すると、それらはすべてフォームに送り返されます。
私の質問は: フォームを実際に無効にすることは可能ですか?
事前にthx。
multithreading - スケジュールされたタスクをキャンセルする
イベントを受信する Windows Delphi アプリケーションがあります。これらのイベントのそれぞれで、タスクを並行して実行したいと思います (次のイベントの準備ができるようにするため)。omnithread ライブラリの抽象化を通じてこれを行う方法はたくさんあります。
問題は、イベントの受信直後にコードの一部を実行する必要があり (基本的にイベントパラメーターを「デコード」するため)、別の部分を数秒後に実行する必要があることです。同じ文脈。この動作は、「この新しい値が 3000 ミリ秒以上続く場合にのみ保存し、それ以外の場合はキャンセルする」に対応する必要があります。したがって、同じコンテキストで新しいイベントが到着した場合、実行中のタスク (3000 ミリ秒待機するタスク) を「キャンセル」する必要があります。最初のステージが終了すると、キャンセルするかどうかを尋ねることなく、2 番目のステージのキューが自動的にいっぱいになるため、パイプラインの抽象化を使用できません。
それは可能ですか?
ありがとうございました。
multithreading - OmniThreadLibrary を使用して操作の「コンベヤ」を設計するにはどうすればよいですか?
通知アイコンからアクセスできる「開始」および「停止」メニュー項目を持つ Windows Delphi アプリケーションがあります。[開始] をクリックした後、次のことを行う必要があります (実装を参照)。
ThreadMonitor : 最初のスレッドは、指定されたフォルダーに指定されたファイルが表示されるのを待機しています。
ThreadParse : ファイルが表示されたら、(コンテンツを解析するために) 別のスレッドに転送し、次のファイルの監視を続行する必要があります。
ThreadDB : すべてのデータが解析されたら、それらを MySQL DB に保存します。(アクティブな DB 接続を持つ別のバックグラウンド スレッド?)
ThreadLog : 手順 1 ~ 3 でエラーが発生した場合は、手順 1 ~ 3 を中断せずにログ ファイル (別のバックグラウンド スレッド?) にエラーを書き込みます。
つまり、停止を押すだけで作業が停止する連続コンベアのようなものであることがわかりました。OmniThreadLibrary のさまざまなメソッドから何を使用すればよいですか?
delphi - Delphi TParallel が使用可能なすべての CPU を使用していない
マルチスレッド アプリケーションを Delphi XE7 に移行し、新しい TParallel.For 関数をテストしています。ラップトップ (4 コアの Core I-5/Windows 7) で適切に並列処理し、ほぼ一貫して 100% の CPU 使用率を達成することがわかりました。
2x12 コアを搭載した Intel Xeon/Windows 2008 R2 でまったく同じコードを実行すると、約 3% の使用率しか達成できず、2 つのコアしか使用していないように見えます。
Conways Life デモ サンプル アプリケーションを使用しても、同じ問題が明らかです。
Xeon で 100% 近く並列化する OTL を使用してみましたが、残念ながら「クォータが不足しています」という問題に遭遇し、それも解決できないようです。
他の誰かがこれに遭遇しましたか?Stride パラメータ、SetMinWorkerThreads および SetMaxWorkerThreads() メソッドを使用してみましたが、役に立ちませんでした。
multithreading - OTL の Parallel.ForEach の繰り返し呼び出し回数の制限
マルチスレッドに OTL を使い始めたところ、大きな助けになりました。
さまざまな使用Parallel.ForEach
が成功しています。しかし今、私は不可解なケースに遭遇しました。
以下の簡単で完全なコードを参照してください。
反復回数が 1250 を超えると、エラーが発生します。
'System Error. Code: 1816. Not enough quota is available to process this command'.
OTL の基本的な使い方を誤解している可能性はありますか?