4D Summit 2016: Laurent Esnault がプリエンプティブモードでのワーカーとUIを紹介

当社のエンジニアリング担当副社長である Laurent Esnault が、4D Summit 2016 の ブレイクアウトセッション: プリエンプティブ・マルチスレッディング で、複数のプロセス間、およびプロセスとフォーム間の情報交換について説明しました。プリエンプティブ・マルチスレッディングのおかげで、より多くの並列プロセスを持つことができ、その結果、デスクトップまたはWebアプリケーションのいずれでも、より多くのユーザーを追加することができます。

4D Summit 2016 の Laurent のセッションを見逃した方は、この15分間のビデオを見て、プリエンプティブ・マルチスレッディングのマスターによる個人的なトレーニングを楽しんでください!

前提条件

プリエンプティブ・マルチスレッディングを利用するためには、次が必須です:

ぎょっとしないでください! 強力で簡単な解決策をいくつか用意しましたので、実例とともに詳しく紹介します。

プロセス間で情報を共有する方法

プリエンプティブモードでインタープロセス変数が使えない場合、どうやってプロセス間で情報を共有したらいいのでしょうか? そこで、”ワーカー” という新しい概念を導入しました。しかし、ワーカーとは一体何なのでしょうか?

ワーカーとは、メッセージの実行に特化したプロセスに関連付けられたメッセージボックスのことです。CALL WORKERコマンドを使うと、(情報を送ったり、何かをするように要求したりするために) あるプロセスから別のプロセスにメッセージを送ることができます。このコマンドのシンタックスは New processとよく似ていて、任意の引数やプロジェクトメソッドを渡すことができます。

下の短いアニメーションで、その仕組みをよりよく理解しましょう:

この例では、アプリケーションプロセスから myWorkerプロセスに情報を渡そうとしています。アプリケーションプロセスは実行中で、myWorkerプロセスは一時停止しています。

  • アプリケーションプロセスで CALL WORKERコマンドを呼び出して、myWorker にいくつかの引数を渡し、myWorker には myMethodプロジェクトメソッドを実行させます。
  • このコマンドコールは、myWorkerプロセス専用のメッセージ ボックスに非同期的に投稿されるメッセージを作成します。フラグが立っているので、ワーカーは自動的に覚醒してメッセージを受け取り、内容 (引数) を取り出して myMethod を実行します。
  • myWorkerプロセスが myMethod の実行を終了しても、プロセスそのものは終了しません。ただ一時停止して、次のメッセージを待ちます。これが、プロセスを作成し、いくつかの引数でメソッドを実行したのちに終了する New processコマンドとの主な違いです。

では、Worker はいつ終了するのでしょうか? 基本的には、アプリケーションを閉じたとき、または KILL WORKERコマンドを呼び出したときに終了します。また、プロセスは突然終了されるのではなく、終了メッセージがワーカーに送られます。

ワーカーのデモ

デモに使用した データベースの例 (英語) と、それに対応する、ワーカーに関する Vanessaの投稿 をご覧ください。

プリエンプティブプロセスからユーザーインターフェースにアクセスする方法

先ほど、プリエンプティブプロセスからユーザーインターフェースにアクセスすることはできないと述べました。もちろん、それに対する解決策を提供する必要がありました。そこで CALL FORM コマンドを導入しました。このコマンドは CALL WORKER コマンドに似ています。しかし今回、メッセージボックスはプロセスに関連するのではなく、ウィンドウに関連します。

CALL FORM を使うと、ウィンドウにメッセージを送り、その中で実行中のフォームに、いくつかの引数とともにメソッドを実行するように要求することができます。

もう一度、短いアニメーションを使って概念を示してみましょう:

blank

 

この例では、(プリエンプティブかもしれない) プロセスまたはワーカーから、同じプロセスまたは別のプロセスで実行中のフォームに何かを実行させようとしています。

  • CALL FORM コマンドを呼び出し、引数としてウィンドウ参照番号 (具体的にはOpen form window コマンドによって返された倍長整数値など) を渡します。 プロジェクトメソッド (myMethod) をいくつかの引数とともに実行させます。
  • このコマンドコールにより、ウィンドウに関連付けられたメッセージボックスに非同期的に投稿されるメッセージが作成されます。
  • ウィンドウを扱うプロセスは、メッセージがあることを自動的に検知します。そして、そのメッセージを受け取り、渡された引数で myMethod を実行します。
  • その後、プロセスは「通常通り」ウィンドウを処理し続けます (キーダウン、マウスダウンなどのイベントを処理します)。

このように、さきのワーカーの例とかなり似ています。

デモ: フォーム間のメッセージング

フォーム間のメッセージングに関する Vanessaの投稿 で、デモに使用した データベースの例 (英語) とそれに対応する説明を確認してください。