setTimeout (Intervalも?) なにやら変No.11675
こみやんま さん 24/05/31 11:52
 
下記にサンプルを提示しますので挙動を比較してみてください。
ちょっとヤバいような気もしなくもないです。

■想定通りの挙動をする その@

jsmode "WebView2";
js {
debuginfo(2);
function func1(c) {
    console.log(c)
}
function func2(c) {
    console.log(c)
}
hidemaru.setTimeout(func1, 100, 10);

}

■想定通りの挙動をする そのA

jsmode "WebView2";
js {
debuginfo(2);
function func1(c) {
    console.log(c)
}
function func2(c) {
    console.log(c)
}
hidemaru.setTimeout(func1, 100, 10);
hidemaru.setTimeout(func2, 200, 20);

}

■想定通りの挙動をする そのB

jsmode "WebView2";
js {
debuginfo(2);
function func1(c) {
    console.log(c)
}
hidemaru.setTimeout(func1, 100, 10);

message("OK");

}

■あ、あれれ? 変だ! その@

jsmode "WebView2";
js {
debuginfo(2);
function func1(c) {
    console.log(c)
}
function func2(c) {
    console.log(c)
}
hidemaru.setTimeout(func1, 100, 10);
hidemaru.setTimeout(func2, 200, 20);

message("OK");

}

■想定通りの挙動をする

jsmode "WebView2";
js {
debuginfo(2);
function func1(c) {
    console.log(c)
}
function func2(c) {
    console.log(c)
}
window.setTimeout(func1, 100, 10);
window.setTimeout(func2, 200, 20);

message("OK");

}



■推察

hidemaru.setTimeout は、メインのマクロが実行中に発動すると、
1つしか登録することが出来ない?

[ ]
RE:11675 setTimeout (Intervalも?) なにNo.11676
こみやんま さん 24/05/31 12:00
 
■こっちだと不思議と動作

jsmode "WebView2";
js {
debuginfo(2);
function func1(c) {
    console.log(c)
}
function func2(c) {
    console.log(c)
}
hidemaru.setTimeout(func1, 100, 10);
hidemaru.setTimeout(func2, 200, 20);

}

message "OK";


[ ]
RE:11676 setTimeout (Intervalも?) なにNo.11677
こみやんま さん 24/05/31 12:24
 
出先でランニングしててちと手元で確認出来ないですが、
よく考えると、別のところで投稿してたやつは
ほぼ全く同じ構成で動作してたので、
hidemaru.settimeoutの「第三引数」の処理に問題があるのかも。

そこが問題なければ、無名関数か、有名関数かで違うとか。

[ ]
RE:11676 setTimeout (Intervalも?) なにNo.11680
こみやんま さん 24/05/31 13:50
 
なんか根本的にかなりヤバい動きになってる気がするw

■手順
まずは秀丸上のファイル全部閉じる

以下のファイルをaaa.macとして作成して、そのファイルを開いたまま実行

jsmode "WebView2";
js {
debuginfo(2);
    hidemaru.setTimeout(
        (x)=>
        {
            console.log(10);
        },
        100, 25
    );
    hidemaru.setTimeout(
        (x)=>
        {
            console.log(20);
        },
        600, 50
    );

    message("a");

}



■結果 10と表示される。


■次に「開いているマクロファイルを以下のように」編集し、そのまま実行する。
(先ほど実行したもの同じ同一プロセスで実行のこと)

jsmode "WebView2";
js {
debuginfo(2);
    hidemaru.setTimeout(
        (x)=>
        {
            console.log(x);
        },
        100, 25
    );
    hidemaru.setTimeout(
        (x)=>
        {
            console.log(x);
        },
        600, 50
    );

    message("a");

}


■結果 20と表示される。 ← おいおいおいw 前回の実行のものが残ってるw


■そのまま何も編集せず、もう1回実行する


■結果 25と表示される。 ← バグってるけどまだましなバグり方

[ ]
RE:11680 setTimeout (Intervalも?) なにNo.11681
秀丸担当 さん 24/05/31 16:03
 
ご指摘ありがとうございます。
確かに同じような問題を確認していて、なにやらおかしい点があると思います。
調べて修正させていただきます。

[ ]