English help on website



非同期(Ver9.35対応版)
目次JavaScript対応− 非同期
非同期
hidemaruオブジェクトの幾つかのメソッド・プロパティは、非同期で使うことができます。
hidemaruGlobalオブジェクトは、全て非同期で使うことはできません。(例外あり、後述)
非同期で使うことができるものには、説明文の最初に[非同期]と書かれています。

JavaScriptで言う非同期とは、マルチスレッドによる同時実行のことではなく、シングルスレッド動作です。
ハングアップするような動作になると、本体もハングアップします。
非同期で呼ばれる関数は、可能な限り速やかに関数を抜ける必要があります。

秀丸マクロのJavaScript対応での非同期とは、マクロ実行中ではないときに呼ばれるJavaScriptの関数のことを意味します。
例えば、setTimeoutで呼び出される関数は、マクロが終了した後に呼び出されます。
この状態は、秀丸マクロを経由しないJavaScriptだけの実行です。秀丸マクロの変数/文やhidemaruGlobalを実行するための準備は無く、比較的高速です。

非同期のJavaScript関数内で、通常のマクロの操作をするためにはpostExecMacroFileまたはpostExecMacroMemoryを使います。
秀丸マクロの変数や文を実行するための準備が行われ、比較的低速です。

非同期のJavaScript関数内で、setVarやgetVarでマクロの変数のやりとりはできません。マクロと値のやりとりするには、setStaticVariable,getStaticVariableを使う方法や、JavaScriptのグローバル変数を使う方法があります。
setStaticVariableを使う場合は、他のマクロと競合しない固有の名前にすることが好ましいです。
例 test1.mac
js{
  function funcAsync(){
    //実行の順番(2)
    //[非同期]ここはマクロ実行中ではない
    hidemaru.setStaticVariable("test1-mac-no-static","あいう",0);
    hidemaru.postExecMacroFile("test2.mac");
  }
  
  //実行の順番(1)
  hidemaru.setTimeout(funcAsync,2000);
}
例 test2.mac
//実行の順番(3)
//ここはマクロ実行中
$test=getstaticvariable("test1-mac-no-static",0);
message $test;
JavaScriptのグローバル変数を使う場合は、マクロ内のjs{}から再び同じ変数を使うことができます。
グローバル変数を使う場合は、jsmodeで名前空間を指定して、他のマクロと競合しないようにするほうが好ましいです。
jsmode "\\" + currentmacrofilename; //オブジェクトが他のマクロと被らないように固有の名前空間にしてください
js{
  function funcAsync(){
    //実行の順番(2)
    //[非同期]ここはマクロ実行中ではない
    testText="test";
    hidemaru.postExecMacroMemory("js{ funcExecmac(); }");
  }

  function funcExecmac() {
    //実行の順番(3)
    //ここはマクロ実行中
    message(testText);
  }
  
  //実行の順番(1)
  hidemaru.setTimeout(funcAsync,2000);
}
hidemaruGlobalのうち、非同期の関数でも使えるものがあります。
colormarker(オブジェクト指定時)
getcolormarker(オブジェクト指定時)
createobject
loaddll

V9.22β14以降
x y column lineno str hex filename result getfilehist
config configcolor getconfig getconfigcolor
updatecount inputstates iskeydown getselectedrange setselectionrange
unichar code up down left right xpixel ypixel xpixel2 ypixel2 
browserpanecommand renderpanecommand setrenderpanetarget

V9.22β15以降
moveto moveto2 movetolineno

V9.22β19以降
setbrowserpanetarget

V9.22正式以降
tickcount

V9.25β2以降
filename2 filename3 

V9.25β5以降
selecting multiselecting

V9.25β13以降
basename basename2 basename3 directory directory2 directory3 
column_wcs column_ucs4 column_cmu column_gcu 
insert 
gettotaltext getlinetext getselectedtext gettext gettext2 gettext_wcs gettext_ucs4 gettext_cmu gettext_gcu 
seltopx seltopy selendx selendy seltopcolumn seltoplineno selendcolumn selendlineno 
seltop_wcs selend_wcs seltop_ucs4 selend_ucs4 seltop_cmu selend_cmu seltop_gcu selend_gcu 
prevposx prevposy getimecandidate 

V9.25β14以降
keyhook clearkeyhoook darkmode xtocolumn ytolineno beginsel endsel clearupdated

V9.25β15以降
hidemaruversion

V9.25β16以降
setstaticvariable getstaticvariable
envchanged

V9.25β18以降
setwindowpos

V9.35β7以降
existfile

今後他の文も使えるように変化する可能性があります。
debuginfo(2);をしておくと、非同期実行時のエラー内容をアウトプット枠に表示できます。

新しく追加したものは、非同期の関数が呼ばれて実行されるタイミングで、hidemaruversionを書くことを推奨するメッセージが出ます。
(V9.22β14以降としているものは、一部前から使えていたものがあり、全てのケースで推奨するメッセージは出るわけではありません)
hidemaruversionと共に、動作可能なバージョンをマクロの先頭に書いておくと、バージョンを推奨するメッセージは出なくなります。