|
「マクロ実行中」に「別マクロ等を実行」するのは、2系統あるように思えます。
そこでちと分類確認と質問です。
■質問系統1
前提:マクロ枠は「全秀丸マクロ」で合計でたった1つ
@ try系。実行できるかをトライし、失敗時はエラーなりスルーなりになるもの。
ほとんどのものはこちらに該当する。「自動起動系」も実はおそらくこちらに該当?
少し「マクロ枠の空き待ち」を待機しているものもありますか?
A queue系。「その瞬間」実行できるかをトライしているのではなく、
まずは「マクロ内容」がキューに登録され、実行可能になるまで
「ひたすらに待機」し、実行可能になったら、実行する。
「キューの数」は1つではなく、多数(無限とまでは言わないが現実的に上限にかか
るハズがない数)が用意されている。
ここら辺で、どのような制限を付けていますか? 実はタイムアウトもしくは想定よ
り低いqueue個数制限がある?
queue系に属するものは、今のところ hidemaru.postExec***系のみで、
それ以外のものは、「sendmessage/WM_REMOTE_EXECMACRO_MEMORY」等、win32用関数
(C言語用関数)や
「自動起動」の仕組みなど全て含め、提供されていない?
// hidemaru.postExec*** は try系ではなく、queue系である。
--------------------------------------
jsmode "WebView2";
js {
hidemaru.setTimeout(
()=>
{
hidemaru.postExecMacroMemory('message "b";')
},
1000
);
hidemaru.setTimeout(
()=>
{
hidemaru.postExecMacroMemory('message "c";')
},
1200
);
}
message "a";
--------------------------------------
■質問系統2
以下のようなIsMacroExecutingと非同期sleepでの「マクロ空きチェック」は記述し
ないほうが良い?
いつかマクロスロットの枠が空いたらpostExecが実行するのだから、チェック自体不
要?
// 実際には何か「同期関数」が必要な内容だとする、今回は同期関数記述ははしょる
function setResultObj() {
// んごんごんごごといった同期処理。
// 最近ちょっとはやりの言葉でいう「るる」同期処理というやつだ。
// 必要なデータ使い終わったのでクリア(まぁ別途フラグでも良い)
result_obj = "";
}
async function recieveFetchReply(text) {
try {
result_obj = text;
// マクロ実行中かもしれないので、5回トライする
for (let i = 0; i < 5; i++) {
// 同期処理が済んでるならば終わり
if (result_obj == "") {
return;
}
// マクロ実行中ならばちょっとまつ、
if (hidemaru.isMacroExecuting()) {
await sleep_in_tick(500);
continue;
}
// 最終処理。これを実行できたら 続きはしない
hidemaru.postExecMacroMemory("js{ setResultObj(); }");
return;
}
writeLineOutputPane("他のマクロ実行中が継続したため、翻訳を出力でき
ませんでした。");
} catch (e) {
writeLineOutputPane("翻訳エラー:");
}
}
// 非同期内でのスリープ関数用途
function sleep_in_tick(ms) {
return new Promise(resolve => hidemaru.setTimeout(resolve, ms));
}
|
|