当社のエンジニアリング担当副社長であるLaurent Esnaultが、Break Out Sessionで、複数のプロセス間およびプロセスとフォーム間の情報交換について説明しています。4D Summit 2016のBreak Out Session:Preemptive Multi-threadingで、複数のプロセス間、およびプロセス間の情報交換について説明しています。プリエンプティブ・マルチスレッディングのおかげで、デスクトップまたはWebアプリケーションのいずれでも、より多くの並列プロセスを持つことができ、その結果、より多くのユーザーを追加することができます。
4D Summit 2016のLaurentのセッションを見逃した方は、この15分間のビデオを見て、プリエンプティブ・マルチスレッディングのマスターによる個人的なトレーニングを楽しんでください!
前提条件
プリエンプティブ・マルチスレッディングを利用するためには
- 64ビットのみ
- コンパイルモード
- プリエンプティブレディコマンドのみ
- プロセス間変数なし
- ユーザーインターフェースなし
でも、怖がらないでください!強力で簡単な解決策をいくつか用意しましたので、実例とともに詳しく紹介します。
プロセス間で情報を共有する方法
プリエンプティブモードでプロセス間変数がない場合、プロセス間でどのように情報を共有するのでしょうか?そこで、新しい概念を導入します。「ワーカー “です。しかし、ワーカーとは一体何なのでしょうか?
よくぞ聞いてくれました!これは、メッセージの実行に特化したプロセスに関連付けられたメッセージボックスです。を使えば CALL WORKERコマンドを使うと、あるプロセスから別の プロセスにメッセージを送ることができます(情報を送ったり、何かをするように要求したりする)。このコマンドのシンタックスは New process例えば、任意のパラメータやプロジェクトメソッドを渡すことができます。
小さなアニメーションを使って、その仕組みをよりよく理解しましょう。
この例では、アプリケーションプロセスからmyWorkerプロセスに情報を渡したいのです。アプリケーション プロセスは実行中で、myWorkerプロセスは一時停止しています。
- アプリケーションの処理では CALL WORKERコマンドを呼び出してmyWorkerにいくつかのパラメータを渡し、myWorkerにmyMethodプロジェクト メソッドを実行させます。
- アプリケーション プロセスは実行中で、myWorker プロセスは一時停止しており、myWorkerプロセス専用のメッセージ ボックスに非同期に投稿されるメッセージを作成します。フラグが立っているので、ワーカーは自動的に覚醒してメッセージを受け取り、内容(パラメータ)を取り出してmyMethod を実行します。
- myWorkerプロセスがmyMethod の実行を終了しても、プロセスは終了しません。ただ一時停止して、実行する別のメッセージを待ちます。コマンドとの主な違いです。 New processコマンドとの主な違いは、プロセスを作成し、いくつかのパラメータを指定してメソッドを実行し、その後終了することです。
では、Worker はいつ死ぬのでしょうか?基本的には、アプリケーションを閉じたとき、または KILL WORKERコマンドを呼び出したときに死にます。突然プロセスを終了させるのではなく、Worker に自殺するようにメッセージを送るだけです。
デモです。ワーカー
デモに使用したデータベースの例と、それに対応するVanessa のワーカーに関する投稿をご覧ください。
プリエンプティブプロセスからユーザーインターフェースにアクセスする方法
先ほど、プリエンプティブ・プロセスからユーザー・インターフェースにアクセスすることはできないと述べました。もちろん、それに対する解決策を提供する必要がありました。そこで CALL FORMコマンドを導入しました。このコマンドは CALL WORKERコマンドに似ています。しかし、今回は、プロセスに関連するメッセージボックスではなく、ウィンドウに関連するメッセージボックスです。
CALL FORMを使うと、ウィンドウにメッセージを送り、その中で動作しているフォームに、いくつかのパラメータを持つメソッドを実行するように要求することができます。
もう一度、小さなアニメーションを使って概念を示してみましょう。
この例では、プロセス (プリエンプティブ) またはワーカーから、同じプロセスまたは別のプロセスで実行中のフォームに何かを実行したいとします。
- 私たちは CALL FORMコマンドを呼び出し、入力パラメータにウィンドウ参照番号(つまり、コマンドによって返されたlong int値) を渡します。 Open form windowを入力パラメータとして渡し、実行したいプロジェクトのメソッド(myMethod) といくつかのパラメータを渡します。
- これは、ウィンドウに関連付けられたメッセージボックスに非同期に投稿されるメッセージを作成します。
- ウィンドウを扱うプロセスは、メッセージがあることを自動的に検出します。そして、そのメッセージを受け取り、myMethod メソッドとそのパラメータを実行します。
- その後、プロセスは「通常通り」ウィンドウを処理し続けます (キーダウン、マウスダウンなどのイベントを処理します)。
見ての通り、これはワーカーに関する前の例とかなり似ています。
デモ: フォーム間のメッセージング
Vanessa のフォーム間のメッセージ ングに関する投稿で、 デモに使用したデータベースの例とそれに対応する説明を確認してください。