hidemaru.postExec***はマクロQueue?No.10393
こみやんま さん 24/05/30 11:59
 
 「マクロ実行中」に「別マクロ等を実行」するのは、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));
}

[ ]
RE:10393 ヘルプの「スケジュール」がqueuNo.10394
こみやんま さん 24/05/30 12:05
 
ということですかね?

[ ]
RE:10394 ヘルプの「スケジュール」がqueuNo.10395
秀丸担当 さん 24/05/30 17:29
 
マクロ枠は、基本的に全秀丸で1つだけです。
自動起動系も同様です。
例外的に、setbackgroundmodeによるモードと、プライベートモードでは別枠で実行
できます。

hidemaru.postExecMacroMemoryは、キューのように積みあがっていくのではなく、ス
ケジュールされるのは1つだけです。
単に、JavaScriptのコールバッ クで呼ばれる関数内から直接従来のマクロを使えな
いので、それを回避するためだけにあるようなものになっています。
例のマクロで2つ積んでいるように見えるのはちょっと不思議というか調べる必要が
ありそうです。

マルチスレッドではないので、hidemaru.isMacroExecutingを調べてループするのは
意味がないはずということになります。
何かしら対策するとしたら、キューできるようにするか、isScheduledのようなスケ
ジュールされているかどうか調べるのがあったらいいかもしれないです。

[ ]
RE:10395 ヘルプの「スケジュール」がqueuNo.10397
こみやんま さん 24/05/30 18:52
 
>hidemaru.postExecMacroMemoryは、キューのように積みあがっていくのではなく、
>スケジュールされるのは1つだけです。

1つしか詰まないとなると仕様的に破綻していないですか?
(複数詰みあがるのであればあまり問題ないですが)

@「1つ詰みあがって」いつ実行されるかわからない
A1つ詰みあがっている段階で、次の新postExecが来た時は、その新しいのはスルー
(※Aタイプ)、もしくは詰みあがってるものを消して上書き(※Bタイプ)

@かつAなのであれば、

(Aタイプ)ならば、
let idScheduleIdSuccess = hidemaru.postExec***
という「スケジュールそのものに成功した」という判定が必要ですし、

(Bタイプ)ならば、「postExec***はスケジュールされている」という判定が出来る必
要があります
if (!hidemaru.isPostExecScheduled()) {
    idSchedule = hidemaru.postExec***
}

AタイプにしろBタイプにしろ、少し難度が高いきもしますねぇ。

個人個人が書く難度というよりも、「手抜きでよくわからずマクロ書いてる人」がい
ると、「他の人の正しく書いたマクロ」まで巻き添えを食らうという点で難易度が高
い。

むしろ今、担当さんの実装した「ハズ」とは異なり、明らかに複数が正常に詰みあが
ってると思われるますw

[ ]
RE:10397 ヘルプの「スケジュール」がqueuNo.10399
秀丸担当 さん 24/05/31 10:56
 
調べてみて、幾つかの段階があってのことのようでした。
コールバックで呼ばれる関数自体にはキューがありました。
postExecMacroMEmory自体にはキューは無いです。
キューありにするか、成否などの幾つかの対策をしたほうがよさそうです。
また検討します。

[ ]