|
>非同期
■hm.NET(やhm.CppInvoke/hm.NetCOM)では、
・Hm.Macro.Exec.Method
https://xn--pckzexbx21r8q9b.net/?page=nobu_tool_hm_dotnet_started_macro_method
・Hm.Macro.Exec.File (担当さんが投稿してるSendMessgaeでWM_REMOTE_EXECMACRO_F
ILE が実態ですね)
・Hm.Macro.Exec.Eval(同じくWM_REMOTE_EXECMACRO_MEMORY)
と言う形で、非同期の口を整理して実装しました。
C#は「イベントハンドラー」の概念が言語やライブラリに
色濃く反映されているため、
「dllとしてプロセスに張り付いて、しかも一度張り付くと解放が実質不可能でハズ
れない」関係上、
「ボタンを押したら○○するとか、書き換えられたら△△するとか」
そういうことをしたいよね、といったことで用意しました。
■一方スクリプト系のもの(hmPythonやhmJS)は、Webだとリスナーなどでイベンド駆
動タイミング等の取り扱うものの
秀丸の場合「自動実行マクロ」があることと、「マクロ実行枠は、全プロセスで合わ
せて1つ」しかない関係上
非同期系の口は用意せず、「同期実行」「Once実行」を旨としました。
(混乱しか呼ばないと判断した側面もあります)
しかし、後片付けだけはしたいかもしれない、ということで、DestroyScopeを
コールバックとして用意しました。
(本当はAddDestroyScopeHandlerにするべきだったですが、まぁ
基本は各人の個人使用を出ないだろうから大丈夫でしょう)
■jsモードで非同期呼ぶならば,,,
非同期で呼ぶといっても、実態としては、呼び出しタイミングだけ非同期で、
実行としては同期となるハズです。
(もとが実行枠が1つしかないのですから、同期でないとマクロ空間上の関数を機
能させるのが難しいハズなので)
・1つはあらかじめエディタならではの「イベント名」を決めておき、
a) イベントハンドラー(addEventLisner/addEventHandler)といったようなもの
で、「処理関数」もしくは「処理ファイル」を登録するというものでしょうか。
例えば、「編集ペインのファイル名が変化した時」とかだと addEventHandl
er(あるいは、addEventListener などといった名称で
hidemaru.addEventHandler("OnChangeFileName", myChangeFileName); // m
yChangeFileName = function(newFilePath)
hidemaru.addEventHandler("OnProcessClosing", myProcessClosing); // O
nProcessClosing = function(closingReason)
hidemaru.addEventHandler("OnProcessClosing", currentmacrodirectory()
+ "\\OnProcessClosing.js");
b) 上のような「サイトー企画側から与える規定のイベント駆動名」だけでなく、
ユーザーが条件を決める、
といったようなところをしたいところですが、
「非同期の間は、秀丸マクロのhidemaruGlobalの関数は使えなくなる」「マク
ロ実行枠は全プロセスで合わせて1つしかない」ことを
考えると、
「駆動条件自体の記述にどの関数が使えて、どの関数が使えないのかよくわか
らない」といったことになるような気もします。
c) 特定の条件によらない、例えば、Tickのようなものもあって良いかもしれません
hidemaru.addTickEventHandler(3000, myTickEventHandler); //
しかし、現実的な使用感としては、このTickの度に「秀丸マクロ用の関数使用
可能に切り替えるため同期モード」になるので、、
なにやら「引っかかりが有るんだけれども...」になりやすいんじゃないかと
思います。
|
|