問題タブ [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.
multithreading - Delphi-スレッドフレームワーク
Delphiアプリケーションで使用するスレッドフレームワークを探しています。
現在、私は「<a href="http://otl.17slon.com/index.htm" rel="nofollow noreferrer"> OmniThreadLibrary」を評価しています。これまでのところ、見栄えがよく、必要なすべてを実行しています。
Delphi用の他の「スレッドフレームワーク」はありますか?
(私はD2006とD2009を使用しています)
delphi - VirtualTreeview と OTL を使用したメモリ リーク
小さなマルチスレッド アプリケーションを作成しましたが、それを変換して OmniThreadLibrary を使用しようとしています。Virtualtreeview を使用して、ログとステータス/結果を表示しています。Vst ログには 2 つの列しかなく、レコードには 2 つの文字列フィールドしか含まれていません (非常に単純で、レコード内にオブジェクトはありません)。
OTL (スレッド プール #11) に付属する DEMO プロジェクトを使用して、リストボックスの代わりに VirtualTreeview を使用するようにプロジェクトを変更しました。デモから「タスクを実行」するとメモリ リークは発生しませんが、「タスクを実行」を複数回実行するとメモリ リークが発生します。タスクを複数回実行すると、メモリ リークが発生します。VirtualTreeView をまったく使用しない場合、いつでもメモリ リークは発生しません。VST を使用するときと、タスクを複数回実行するときだけです。
私は FreeNode イベントを使用して文字列をクリアし、さらに Finalize を使用してみました...
例:
タスクを複数回実行するとメモリ リークが発生するのはなぜですか? FastMM4 最新の Virtualtreeview と OTL を備えた Delphi 2010
multithreading - OmniThreadLibraryを使用してスレッド変数にアクセスする方法は?
これは簡単な作業のようです。OmniThreadLibraryの使用を開始する方法がわかりません。
バックグラウンドで処理を行うタスクを作成します。結果はタスククラスのフィールドに保存され、新しい値で継続的に入力されます。
ここで、メインスレッドはこれらのフィールドを読み取り、それらの値を時々表示したいと考えています。
したがって、これらのフィールドにアクセスし、これらの時点で書き込まれないようにする必要があります(同期)。
OmniThreadLibraryでこれをどのように行うことができますか?
delphi - タスク間でメッセージを送信することは可能ですか(OmniThreadLibrary)?
私のアプリには、さまざまなアクションのためのいくつかのタスクがあります。
すべてのタスクはFormCreateで作成され、FormDestroyで終了します。アプリが実行されている限り、タスクは常に実行されます。
メインスレッドの唯一の目的は、ユーザーI / Oを処理し、ユーザー入力を適切なタスクに送信するか、メインフォームに表示されるタスク情報を受信することです。
タスク間で転送する必要のあるデータがあります。
例:
データ処理を行うタスクAがあります。
結果の一部をメインスレッドに送信して表示します。
また、いくつかの(他の)データをタスクBに送信する必要があります。タスクBは、データを別のPCに転送します。
タスクCは、ハードウェアデバイスからデータを受信し、このデータをタスクAに送信して処理する必要があります。
等...
これまで理解してきたように、OmniThreadLibraryを使用したメッセージの送信は、常にタスクとタスクを作成したスレッド(メインスレッドとタスクA、またはメインスレッドとタスクB)の間で行われます。
2つのタスク間で直接メッセージを送信するにはどうすればよいですか?
それとも、これまでの私のアプローチに問題があり、それは完全に異なる方法で行う必要がありますか?
delphi - IOmniWorker: タスク内で実行する関数はどこに行くのですか?
データ処理を行うために OmniWorker-Task を作成しています。
これまでのところ、タスクは他のタスクとの間でメッセージを送受信できます。
次に、このタスクのメイン関数を実装する必要があります。この関数は継続的に実行され、データ処理を行いますが、メッセージはその動作を変更します。
しかし、このメイン関数をどこに置くのでしょうか?
実装する必要がある OmniWorker の「実行」メソッドのようなものはありますか?
delphi - OmniThreadLibraryの概要
OmniThreadLibray for Delphiの概要を紹介する場所はありますか?
現在のコードをDelphiXEにインストールしています。例は機能します。関連するDelphiGeekブログを使用例とともに調べてきました。Gabrは、ドキュメントが存在しないことを認めています。具体的な例に入る前に、フレームワークの構造を理解したいと思います。私はTThreadの使用法を理解しているので、Threading101サイトにアクセスする必要はありません。
フレームワークには忠実な支持者がいることが示されているので、私はちょうど適切な場所を見ていなかったと思います。
multithreading - マルチスレッド WinHttp ダウンロード
インターネットからファイルをダウンロードする Delphi アプリケーションを作成しています。サーバーが範囲要求をサポートしている場合、マルチスレッドになります。進行状況も GUI に中継されます。
現在のソフトウェア モデルはTThread
コンポーネントを使用しています。GUI は を呼び出し、TDownloadThread
次に を生成しTDownloadPartThreads
ます。これらは、'WinHttp' を介して実際にダウンロードを行うスレッドです。
私の問題:4つのスレッドしかダウンロードしていない1つのダウンロードでも、CPUが使い果たされます。
私の想定される原因:
- 宛先ファイルに 8192 バイトごとに書き込みを行っていますが、1 つのブロックに書き込む前にバッファリングする必要があるかどうか疑問に思っていました。
- スレッド通信は
Synchronize(MainForm.UpdateProgress(Downloaded, TotalSize))
、私が聞いた中で行われるのはひどいものです。おそらく、スレッド間でオブジェクトを共有して、メインフォームのタイマーを使用してこれにアクセスし、進行状況を更新できるようにする必要がありますか?
私のソリューション
ファイルの書き込みをずらして、すべての
x
バイトのみを書き込みます。TThread
使用するコンポーネントを更新し、OmniThreadLibrary
何らかの形でデータをメイン フォームに送り返します。その後、各TDownloadPart
スレッドは になりIOmniWorker
、オブジェクトをメイン フォームと共有することで進行状況を送り返します。次に、メイン フォームはタイマーを使用して、次のように進行状況を更新します。ProgressBar1.Position := sharedDataObject.Progress;
うまくいけば、誰かが私を正しい方向に向けることができます!
delphi - スレッドでdatasnapServerMethodによって返されるDataSetを使用しますか?
Omnithreadlibraryを使用してスレッド内からservermethodを呼び出していますが、データは正常に返されますが、返されたデータの使用に問題があります。私が試したすべてのことはAccessViolationで行われるか、アプリケーションのクラッシュでさえあり、データセットを設定しようとしました。 ClientDataSetにリンクされたDataSetProviderですが、ここでも機能しません。最後に、OleVariantを返すようにサーバーメソッドを設定し、ClientDataSetのDataプロパティに直接設定しましたが、エラーも発生しました。
私の目的は、リクエストをスレッドで実行し、データをメインスレッドの関数に返して、グリッドを作成することです。
助言がありますか?
multithreading - 最小限のリソースを使用して定期的に何かをチェックするスレッドを実装するにはどうすればよいですか?
一定の時間間隔でサーバーへの接続をチェックするスレッドをバックグラウンドで実行したいと思います。たとえば、5秒ごと。
これに適した「デザインパターン」があるかどうかわかりませんか?私が正しく覚えているなら、executeメソッドでスリープしているスレッドは良くないことをどこかで読んだことがあります。しかし、私は間違っているかもしれません。
また、通常のTThreadクラスまたはOTLスレッドライブラリを使用できます。
何か案は?
ありがとう。
multithreading - このプロジェクトには、手続き型とオブジェクト指向のどちらが適していますか?
私は、画像の読み込み/キャッシュシステムの多くの試行/エラーバージョンに取り組んできました。Delphiである私は、常にオブジェクト指向プログラミングに慣れています。しかし、私はいくつかのマルチスレッドの実装を開始して以来、このシステムは代わりに手続きベースで機能するはずだと考えていました。
これらのプロセスがスレッドプールにキックインされ、イメージのダーティなロード/保存を実行し、それらを解放するためです。プロシージャ/関数、レコード、イベント、およびグラフィックスを使用できるときに、これらのスレッド化されたプロセスをオブジェクト内にラップしようとしてきました。すべてがユニット内にある場合、すべてをクラス内にラップする必要はありません...そうですか?
今私が尋ねている主な理由の1つは、このシステムがユニットの下部で初期化されているためです。OmniThreadLibrary(OTL)を使用する場合、すでに初期化された独自のスレッドプールがあり、私も初期化する必要はありません。
では、このシステムにはどちらのアプローチが適しているのでしょうか。オブジェクト内にラップされているのか、ユニット内で機能しているだけなのか、そしてその理由は何ですか。オブジェクト内ではなく、ユニット内で何もラップしないマルチスレッドの例はありますか?