別プロセスの変数アクセスについて
2 posters
別プロセスの変数アクセスについて
お世話になります。v16.4 macOS Mojave.
別プロセスから、呼び出し元のプロセス変数へのアクセスを行いたい場合、GET PROCESS VARIABLE とSET PROCESS VARIABLEが用意されており、通常そちらを使用します。別プロセスへの変数アクセスコマンドが用意されている位なので、New Processの引数でポインタを渡す事はできないと思っていましたが、今回ふとした事でテストすると、別プロセスからポインタ経由での変数書き換えが行えました。こちらは継続利用しても問題ない挙動なのでしょうか?
別プロセスから、呼び出し元のプロセス変数へのアクセスを行いたい場合、GET PROCESS VARIABLE とSET PROCESS VARIABLEが用意されており、通常そちらを使用します。別プロセスへの変数アクセスコマンドが用意されている位なので、New Processの引数でポインタを渡す事はできないと思っていましたが、今回ふとした事でテストすると、別プロセスからポインタ経由での変数書き換えが行えました。こちらは継続利用しても問題ない挙動なのでしょうか?
osaru- 投稿数 : 67
登録日 : 2017/08/14
Re: 別プロセスの変数アクセスについて
こんにちは
v17以降,プロセス間通信の新しい仕組み(CALL WORKER, CALL FORM, New signal)が用意されているので,GET PROCESS VARIABLE, SET PROCESS VARIABLE, CALL PROCESS (POST OUTSIDE CALL) などは,すべて「過去のもの」となっています。
無くなるわけではないので,既存のコードに手を加える必要はありませんが,新規の開発ではコマンドの存在を無視してOKです。
GET PROCESS VARIABLEなどのコマンドは,OSからみれば単一のプロセスである4Dが論理的な別の「プロセス」として,便宜上,分割しているスレッド間でデータを受け渡しするという仕組みに基づいています。そのようなスレッド(コオペラティブスレッド)は,ほんとうに並行処理をしているわけではなく,「分身の術」のように一人のプロセス(4D)がちょっとずつ動いているのに過ぎません。プロセス変数の「読み書き」は「自分が動いている間は相手が止まっている」という前提があるために成り立っています。
v17の64ビット・コンパイルモードでは,プリエンプティブスレッドといって,ほんとうに独立したプロセスが複数のCPUコアによって同時に仕事を進めることができます。独立して動いているので,プロセス変数の「読み書き」はできません。その代わり,相手に擬似的な「メール」を送ることができます。手が空いたとき(メソッドの終わり)にそれをチェックし,返信するというわけです。
https://www.slideshare.net/kmiyako/inside-multithreading
https://speakerdeck.com/miyako/purienputeibumodo-developer-conference-2018yori
New processにポインターを渡すことについてですが,4Dのポインターは構造体(変数名・プロセス番号など)であり,参照ではないので,そのポインターを「逆参照」したものが有効な変数を指しているという保証はありません。
たとえば,フォーム上の->VARを新規プロセスに渡し,そのプロセスから$1->を書き換えれば,そしてフォームの再描画を要求するためにCALL PROCESS(-1)を実行すれば,フォームを非同期で更新することができます。(新名称:POST OUTSIDE CALL)
https://doc.4d.com/4Dv17/4D/17.1/POST-OUTSIDE-CALL.301-4178791.ja.html
とはいえ,相手プロセスが終了した場合,$1->は無効なポインターとなってしまうことに留意が必要です。
同じことは,New processの引数を使用しなくても実現できます。
インタープロセスポインターの<>VARに->VARをあるプロセスから代入すれば,どのプロセスからでも<>VAR->を介してそのプロセス変数を読み書きすることができます。このことは,v11のアップグレードリファレンスで説明されていました。
p. 360 「プロセス変数へのポインター」
http://library.4d-japan.com/REFERENCE/v11/4D_v11_Upgrade.pdf
しかし,これも今となっては「昔のテクニック」です。
インタープロセス変数・GET PROCESS VARIABLE・SET PROCESS VARIABLEは,プロセス(=アプリケーション)がたくさんのタスクをひとりでこなすスタイルに由来するという点で「過去のもの」であることに留意する必要があります。
v17以降,プロセス間通信の新しい仕組み(CALL WORKER, CALL FORM, New signal)が用意されているので,GET PROCESS VARIABLE, SET PROCESS VARIABLE, CALL PROCESS (POST OUTSIDE CALL) などは,すべて「過去のもの」となっています。
無くなるわけではないので,既存のコードに手を加える必要はありませんが,新規の開発ではコマンドの存在を無視してOKです。
GET PROCESS VARIABLEなどのコマンドは,OSからみれば単一のプロセスである4Dが論理的な別の「プロセス」として,便宜上,分割しているスレッド間でデータを受け渡しするという仕組みに基づいています。そのようなスレッド(コオペラティブスレッド)は,ほんとうに並行処理をしているわけではなく,「分身の術」のように一人のプロセス(4D)がちょっとずつ動いているのに過ぎません。プロセス変数の「読み書き」は「自分が動いている間は相手が止まっている」という前提があるために成り立っています。
v17の64ビット・コンパイルモードでは,プリエンプティブスレッドといって,ほんとうに独立したプロセスが複数のCPUコアによって同時に仕事を進めることができます。独立して動いているので,プロセス変数の「読み書き」はできません。その代わり,相手に擬似的な「メール」を送ることができます。手が空いたとき(メソッドの終わり)にそれをチェックし,返信するというわけです。
https://www.slideshare.net/kmiyako/inside-multithreading
https://speakerdeck.com/miyako/purienputeibumodo-developer-conference-2018yori
New processにポインターを渡すことについてですが,4Dのポインターは構造体(変数名・プロセス番号など)であり,参照ではないので,そのポインターを「逆参照」したものが有効な変数を指しているという保証はありません。
たとえば,フォーム上の->VARを新規プロセスに渡し,そのプロセスから$1->を書き換えれば,そしてフォームの再描画を要求するためにCALL PROCESS(-1)を実行すれば,フォームを非同期で更新することができます。(新名称:POST OUTSIDE CALL)
https://doc.4d.com/4Dv17/4D/17.1/POST-OUTSIDE-CALL.301-4178791.ja.html
とはいえ,相手プロセスが終了した場合,$1->は無効なポインターとなってしまうことに留意が必要です。
同じことは,New processの引数を使用しなくても実現できます。
インタープロセスポインターの<>VARに->VARをあるプロセスから代入すれば,どのプロセスからでも<>VAR->を介してそのプロセス変数を読み書きすることができます。このことは,v11のアップグレードリファレンスで説明されていました。
p. 360 「プロセス変数へのポインター」
http://library.4d-japan.com/REFERENCE/v11/4D_v11_Upgrade.pdf
しかし,これも今となっては「昔のテクニック」です。
インタープロセス変数・GET PROCESS VARIABLE・SET PROCESS VARIABLEは,プロセス(=アプリケーション)がたくさんのタスクをひとりでこなすスタイルに由来するという点で「過去のもの」であることに留意する必要があります。
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: 別プロセスの変数アクセスについて
miyakoさま、いつもながら分かりやすく詳しい解説ありがとうございます。
まだv16なのですが、Workerプロセスは確か監視カメラ映像を非同期取得して表示させるのに使用しています。
まさにPDFプレビューの非同期遅延ロードを書いていて、試したらちゃんと動作したのでOKナノかな?と思った次第です。さすがにインタープロセス変数経由でやり取りしようとは思いませでしたが、v11時代にちゃんと解説されていたのですね。ドキュメントは一通り目を通した筈ですが・・・残ってないです
まだv16なのですが、Workerプロセスは確か監視カメラ映像を非同期取得して表示させるのに使用しています。
たとえば,フォーム上の->VARを新規プロセスに渡し,そのプロセスから$1->を書き換えれば,そしてフォームの再描画を要求するためにCALL PROCESS(-1)を実行すれば,フォームを非同期で更新することができます。(新名称:POST OUTSIDE CALL)
まさにPDFプレビューの非同期遅延ロードを書いていて、試したらちゃんと動作したのでOKナノかな?と思った次第です。さすがにインタープロセス変数経由でやり取りしようとは思いませでしたが、v11時代にちゃんと解説されていたのですね。ドキュメントは一通り目を通した筈ですが・・・残ってないです
osaru- 投稿数 : 67
登録日 : 2017/08/14
Permissions in this forum:
返信投稿: 不可