タブファイラー開発ブログ

Tablacus ExplorerやX-Finderの作者のブログ

Tablacus Exploerのマルチプロセス

マルチプロセスのアドオンは以下のような感じのスクリプトで実装しています。

 

1.アドオンからワーカープロセスの呼び出し(script.js)

wsh.Runでワーカープロセスを実行しています。

api.PathQuoteSpaces(api.GetModuleFileName(null))」でTEの実行ファイルのフルパスを取得
第1引数「/run」はワーカープロセスのマーク

第2引数はワーカースクリプトのパス(TE32.exe/TE64.exe実行ファイルからの相対パスでOK)

第3引数のuidはワーカープロセスに引数を渡すためにユニークな文字列を作って渡しています。(コマンドラインで受け渡しできる文字数に限界がある)
uidとExchangeという配列を使ってワーカープロセスと値の受け渡しをします。

var uid;
do {
  uid = String(Math.random()).replace(/^0?\./, "");
} while (Exchange[uid]);
Exchange[uid] =
{
  Items: Items,
  Dest: Dest,
  grfKeyState: grfKeyState,
  pt: pt,
  dwEffect: dwEffect
};
wsh.Run([api.PathQuoteSpaces(api.GetModuleFileName(null)), '/run', "addons\\multiprocess\\worker.js", uid].join(" "));

 2.ワーカープロセス(worker.js)

ワーカプロセスではimportScriptsで他のスクリプトを読み込み実行することができます。パスはこのスクリプトからの相対パスでOK

「MainWindow」はメインプロセスのwindowオブジェクトが格納されています。
argはコマンドラインの引数が入っています。

arg[0]はTEの実行ファイルのフルパス

arg[1]は第1引数「/run」

arg[2]は第2引数のワーカースクリプトのパス

arg[3]は第3引数のuid

メインプロセスのwindowオブジェクトのExchangeにやり取りするデータが入っています。

importScripts("..\\..\\script\\consts.js");

if (MainWindow.Exchange) {
  var ex = MainWindow.Exchange[arg[3]];
  if (ex) {
    delete MainWindow.Exchange[arg[3]];