メインコンテンツまでスキップ
バージョン: 20 R5 BETA

SystemWorker

システムワーカーを使うことで、4Dコードは同じマシン上で任意の外部プロセス (シェルコマンド、PHPなど ) を呼び出すことができます。 システムワーカーは非同期で呼び出されます。 コールバックを使用することで、4D は双方向の通信を可能にします。

SystemWorker クラスは、4D クラスストアにて提供されています。

例題

    // ipconfig 情報へのアクセスを取得する Windows での例
var $myWinWorker : 4D.SystemWorker
var $ipConfig : Text
$myWinWorker:= 4D.SystemWorker.new("ipconfig")
$ipConfig:=$myWinWorker.wait(1).response //timeout 1 second

// ファイルのパーミッションを変更する macOS での例
// chmod はパーミッションを変更するための macOS コマンドです
var $myMacWorker : 4D.SystemWorker
$myMacWorker:= 4D.SystemWorker.new("chmod +x /folder/myfile.sh")

概要

| 4D.SystemWorker.new ( commandLine : Text { ; options : Object } ) : 4D.SystemWorker    外部プロセスを開始するために commandLine に渡したコマンドラインを実行する 4D.SystemWorker オブジェクトを作成し、返します | | .closeInput()    外部プロセスの入力ストリーム (stdin) を閉じます | | .commandLine : Text    new() 関数に引数として渡したコマンドライン | | .currentDirectory : 4D.Folder    外部プロセスが実行される作業ディレクトリ | | .dataType : Text    レスポンス本文のデータ型 | | .encoding : Text    レスポンス本文のエンコーディング | | .errors : Collection    実行エラーの場合、4Dエラー (あれば) のコレクション | | .exitCode : Integer    外部プロセスから返される終了コード | | .hideWindow : Boolean    実行ファイルや DOSコンソールのウィンドウを隠すのに使用できます (Windows のみ) | | .pid : Integer    外部プロセスの、システムレベルでの一意的な識別子 | | .postMessage( message : Text)
.postMessage( messageBLOB : Blob)
    外部プロセスの入力ストリーム (stdin) への書き込みをおこないます | | .response : Text
.response : Blob
    リクエストが終了した時点で、返された全データの結合 | | .responseError : Text    リクエストが終了した時点で、返された全エラーの結合 | | .terminate()    SystemWorker の実行を強制終了します | | .terminated : Boolean    外部プロセスが終了された場合に true | | .timeout : Integer    外部プロセスが生きている場合、キルされるまでの秒数 | | .wait( {timeout : Real} ) : 4D.SystemWorker    SystemWorker の実行終了まで、または timeout で指定した時間が経過するまで待機します |

4D.SystemWorker.new()

履歴
リリース内容
19 R4追加

4D.SystemWorker.new ( commandLine : Text { ; options : Object } ) : 4D.SystemWorker

引数タイプ説明
commandLineText->実行するコマンドライン
optionsObject->ワーカーパラメーター
result4D.SystemWorker<-非同期の新規システムワーカー (プロセスが開始されなかった場合は null)

説明

4D.SystemWorker.new() 関数は、外部プロセスを開始するために commandLine に渡したコマンドラインを実行する 4D.SystemWorker オブジェクトを作成し、返します。

返されたシステムワーカーオブジェクトは、ワーカーにメッセージを送信したり、ワーカーの結果を取得するために使用できます。

プロキシオブジェクトの生成中に問題があった場合、この関数は null オブジェクトを返し、エラーが生成されます。

commandLine には、実行するアプリケーションのファイルのフルパス (POSIX シンタックス)、および必要に応じて追加の引数を渡します。 アプリケーション名だけを渡すと、4Dは 実行ファイルを探すために PATH 環境変数を使用します。

警告: この関数は、実行可能なアプリケーションを起動するだけで、シェル (コマンドインタープリター) の一部である命令を実行することはできません。 たとえば Windows で、このコマンドを使用して dir 命令を実行することはできません。

options オブジェクト

options に渡すオブジェクトは、次のプロパティを持つことができます:

プロパティタイプデフォルト説明
onResponseFormulaundefinedシステムワーカーメッセージ用のコールバック。 完全なレスポンスを受け取り次第、このコールバックが呼び出されます。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照)
onDataFormulaundefinedシステムワーカーデータ用のコールバック。 システムワーカーがデータを受け取る度に、このコールバックが呼び出されます。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照)
onDataErrorFormulaundefined外部プロセスエラー用のコールバック (外部プロセスの stderr)。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照)
onErrorFormulaundefined実行エラー用のコールバック。異常なランタイム条件 (システムエラー) の場合にシステムワーカーによって返されます。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照)
onTerminateFormulaundefined外部プロセスが終了されたときのコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照)
timeoutNumberundefinedプロセスが生きている場合、キルされるまでの秒数。
dataTypeText"text"レスポンス本文のデータ型。 可能な値: "text" (デフォルト), "blob"。
encodingText"UTF-8"dataType="text" の場合のみ。 レスポンス本文のエンコーディング。 利用可能な値については、CONVERT FROM TEXT コマンドの説明を参照ください。
variablesObjectシステムワーカー用のカスタム環境変数を設定します。 シンタックス: variables.key=value (key は変数名、value はその値)。 値は、可能な限り文字列に変換されます。 値に '=' を含めることはできません。 定義されていない場合、システムワーカーは 4D環境を継承します。
currentDirectoryFolderプロセスが実行される作業ディレクトリ
hideWindowBooleantrue(Windows) アプリケーションウィンドウを隠す (可能な場合)、または Windowsコンソールを隠す

すべてのコールバック関数は、2つのオブジェクト引数を受け取ります。 その内容は、コールバックに依存します:

引数タイプonResponseonDataonDataErroronErroronTerminate
$param1ObjectSystemWorkerSystemWorkerSystemWorkerSystemWorkerSystemWorker
$param2.typeText"response""data""error""error""termination"
$param2.dataText または Blob取得データエラーデータ

以下は、コールバック呼び出しの流れです:

  1. onData および onDataError は 1回または複数回実行されます。
  2. 呼ばれた場合、onError は 1回実行されます (システムワーカーの処理を停止します)。
  3. エラーが発生しなかった場合、onResponse が 1回実行されます。
  4. onTerminate は常に実行されます。

戻り値

この関数はシステムワーカーオブジェクトを返します。このオブジェクトに対して、SystemWorker クラスの関数やプロパティを呼び出すことができます。

Windows の例

  1. 特定のドキュメントをメモ帳で開きます:
var $sw : 4D.SystemWorker
var $options : Object
$options:=New object
$options.hideWindow:= False

$sw:=4D.SystemWorker.new ("C:\\WINDOWS\\notepad.exe C:\\Docs\\new folder\\res.txt";$options)
  1. コンソールで npm install を実行します:
var $folder : 4D.Folder
var $options : Object
var $worker : 4D.SystemWorker

$folder:=Folder(fk database folder)
$options:=New object
$options.currentDirectory:=$folder
$options.hideWindow:=False

$worker:=4D.SystemWorker.new("cmd /c npm install";$options)

  1. 特定のドキュメントを Microsoft® Word® アプリケーションで開きます:
$mydoc:="C:\\Program Files\\Microsoft Office\\Office15\\WINWORD.EXE C:\\Tempo\\output.txt"
var $sw : 4D.SystemWorker
$sw:=4D.SystemWorker.new($mydoc)
  1. カレントディレクトリでコマンドを実行し、メッセージそ送信します:
var $param : Object
var $sys : 4D.SystemWorker

$param:=New object
$param.currentDirectory:=Folder(fk database folder)
$sys:=4D.SystemWorker.new("git commit -F -";$param)
$sys.postMessage("This is a postMessage")
$sys.closeInput()
  1. ユーザーが Windows上で外部ドキュメントを開くのを許可します:
$docname:=Select document("";"*.*";"開くファイルを選択してください";0)
If(OK=1)
var $sw : 4D.SystemWorker
$sw:=4D.SystemWorker.new("cmd.exe /C start \"\" \""+$docname+"\"")
End if

macOS の例

  1. テキストファイルを編集します (cat はファイルを編集するための macOS コマンドです)。 この例題では、コマンドのフルアクセスパスを渡しています:

var $sw : 4D.SystemWorker
$sw:=4D.SystemWorker.new("/bin/cat /folder/myfile.txt")
$sw.wait() //同期的実行

  1. 独立した "グラフィック" アプリケーションを起動するには、open システムコマンドの使用が推奨されます (これは、アプリケーションをダブルクリックするのと同じ効果を持ちます)。
var $sw : 4D.SystemWorker
$sw:=4D.SystemWorker.new ("open /Applications/Calculator.app")
  1. "Users" フォルダーの中身を取得します (ls -l は、DOS の dir に相当する macOS のコマンドです)。
var $systemworker : 4D.SystemWorker
var $output : Text
var $errors : Collection

$systemworker:=4D.SystemWorker.new("/bin/ls -l /Users ")
$systemworker.wait(5)
$output:=$systemworker.response
$error:=$systemworker.errors

  1. 上記と同じコマンドで、"Params" ユーザークラスを使ったコールバック関数の処理方法を示しています:

var $systemworker : 4D.SystemWorker
$systemworker:=4D.SystemWorker.new("/bin/ls -l /Users ";cs.Params.new())


// "Params" クラス

Class constructor
This.dataType:="text"
This.data:=""
This.dataError:=""

Function onResponse($systemWorker : Object)
This._createFile("onResponse"; $systemWorker.response)

Function onData($systemWorker : Object; $info : Object)
This.data+=$info.data
This._createFile("onData";this.data)

Function onDataError($systemWorker : Object; $info : Object)
This.dataError+=$info.data
This._createFile("onDataError";this.dataError)

Function onTerminate($systemWorker : Object)
var $textBody : Text
$textBody:="Response: "+$systemWorker.response
$textBody+="ResponseError: "+$systemWorker.responseError
This._createFile("onTerminate"; $textBody)

Function _createFile($title : Text; $textBody : Text)
TEXT TO DOCUMENT(Get 4D folder(Current resources folder)+$title+".txt"; $textBody)

.closeInput()

履歴
リリース内容
19 R4追加

.closeInput()

引数タイプ説明
引数を必要としません

説明

.closeInput() 関数は、外部プロセスの入力ストリーム (stdin) を閉じます。

.closeInput() は、postMessage() を介した全データの受信を待機している実行ファイルに、データ送信が終了したことを知らせるのに便利です。

例題

// gzip するデータを作成します
var $input;$output : Blob
var $gzip : Text
TEXT TO BLOB("Hello, World!";$input)
$gzip:="\"C:\\Program Files (x86)\\GnuWin32\\bin\\gzip.exe\" "

// 非同期のシステムワーカーを作成します
var $worker : 4D.SystemWorker
$worker:= 4D.SystemWorker.new($gzip;New object("dataType";"blob"))

// stdin に圧縮ファイルを送信します
$worker.postMessage($input)
// 終了したことを明確にするため closeInput() を呼び出します
// gzip (および stdin からのデータを待機する多数のプログラム) は入力ストリームが明示的に閉じられるまで待機します
$worker.closeInput()
$worker.wait()

$output:=$worker.response

.commandLine

.commandLine : Text

説明

.commandLine プロパティは、new() 関数に引数として渡したコマンドラインを格納します。

このプロパティは 読み取り専用 です。

.currentDirectory

.currentDirectory : 4D.Folder

説明

.currentDirectory プロパティは、外部プロセスが実行される作業ディレクトリを格納します。

.dataType

.dataType : Text

説明

.dataType プロパティは、レスポンス本文のデータ型を格納します。 とりうる値: "text" または "blob"。

このプロパティは 読み取り専用 です。

.encoding

.encoding : Text

説明

.encoding プロパティは、レスポンス本文のエンコーディングを格納します。 このプロパティは dataType が "text" のときにのみ利用できます。

このプロパティは 読み取り専用 です。

.errors

.errors : Collection

説明

.errors プロパティは、実行エラーの場合、4Dエラー (あれば) のコレクションを格納します。

コレクションの各要素は、以下のプロパティを持つオブジェクトです:

プロパティタイプ説明
[].errorCodenumber4Dエラーコード
[].messagetext4Dエラーの詳細
[ ].componentSignaturetextエラーを返した内部コンポーネントの署名

エラーが発生しなかった場合、.errors は undefined です。

.exitCode

.exitCode : Integer

説明

.exitCode プロパティは、外部プロセスから返される終了コードを格納します。 プロセスが正常に終了しなかった場合、exitCodeundefined です。

このプロパティは 読み取り専用 です。

.hideWindow

.hideWindow : Boolean

説明

.hideWindow プロパティは、実行ファイルや DOSコンソールのウィンドウを隠すのに使用できます (Windows のみ)。

読み書き可能 プロパティです。

.pid

.pid : Integer

説明

.pid プロパティは、外部プロセスの、システムレベルでの一意的な識別子を格納します。

このプロパティは 読み取り専用 です。

.postMessage()

.postMessage( message : Text)
.postMessage( messageBLOB : Blob)

引数タイプ説明
messageText->外部プロセスの入力ストリーム (stdin) に書き込むテキスト
messageBLOBBlob->入力ストリームに書き込むバイト数

説明

.postMessage() 関数は、外部プロセスの入力ストリーム (stdin) への書き込みをおこないます。 message には stdin に書き込むテキストを渡します。

.postMessage() 関数は、stdin に渡す BLOB型の messageBLOB 引数も受け取るため、バイナリデータを送信することもできます。

options オブジェクト.dataType プロパティを使って、レスポンス本文が BLOB を返すようにできます。

.response

.response : Text
.response : Blob

説明

.response プロパティは、リクエストが終了した時点で、返された全データの結合を格納します (つまり、プロセスの出力から取得された全メッセージ)。

メッセージのデータ型は dataType 属性によって定義されています。

このプロパティは 読み取り専用 です。

.responseError

.responseError : Text

説明

.responseError プロパティは、リクエストが終了した時点で、返された全エラーの結合を格納します。

.terminate()

.terminate()

引数タイプ説明
引数を必要としません

説明

.terminate() 関数は、SystemWorker の実行を強制終了します。

この関数は、システムワーカーを終了して実行中のスクリプトに制御を戻す命令を送ります。

.terminated

.terminated : Boolean

説明

.terminated プロパティは、外部プロセスが終了された場合に true を格納します。

このプロパティは 読み取り専用 です。

.timeout

.timeout : Integer

説明

.timeout プロパティは、外部プロセスが生きている場合、キルされるまでの秒数を格納します。

このプロパティは 読み取り専用 です。

.wait()

履歴
リリース内容

|19 R4|追加|

.wait( {timeout : Real} ) : 4D.SystemWorker

引数タイプ説明
timeoutReal->待機時間 (秒単位)
戻り値4D.SystemWorker<-SystemWorker オブジェクト

説明

.wait() 関数は、SystemWorker の実行終了まで、または timeout で指定した時間が経過するまで待機します。

timeout には、秒単位の値を渡します。 SystemWorker スクリプトは、timeout に指定された時間だけ、外部プロセスを待ちます。 timeout を省略した場合、スクリプトの実行は無期限に待機します。

実際には、.wait() はタイムアウトに達した場合を除き、onTerminate フォーミュラのプロセス終了まで待ちます。 タイムアウトに達した場合、SystemWorker はキルされません。

.wait() の実行中、コールバック関数、とくに他のイベントや他の SystemWorker インスタンスからのコールバックは実行されます。 コールバックから terminate() を呼び出すことで、.wait() を終了することができます。

この関数は、SystemWorker オブジェクトを返します。

SystemWorker を 4D のワーカープロセスから作成した場合、この関数は必要ありません。