メインコンテンツまでスキップ
バージョン: v20 R4 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()

履歴
バージョン内容
v19 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()

履歴
バージョン内容
v19 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()

履歴
バージョン内容

|v19 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 のワーカープロセスから作成した場合、この関数は必要ありません。