HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0512
窓月らら[不具合報告] 特定の条件でend命令の実行に失敗する(解決方法あり)4解決


窓月らら

リンク

2020/5/12(Tue) 17:42:28|NO.90410

表題のとおりですが、#deffunc/#defcfunc 内で onclick による割り込みが
発生した場合にジャンプ先でend命令が実行できないようです。
HSPは最新版と3.51でテストしましたがいずれも同じです。
以下に再現用コードを示しますので、よろしかったらテストをお願いいたします。
#deffunc/#defcfunc 内で wait/await を使うと結構いろいろ起きます。

#packopt name "end_test" #packopt hide 1 // PostQuitMessage のテスト用 #uselib "user32.dll" #func PostQuitMessage "PostQuitMessage" int #define APP_NAME "end test" b="\n\ndeffunc 内実行中に\n右クリック→[はい]で終了しよう\n" b+="としても end命令 が return の\nような挙動になり終了できない。\n\n" b+="右クリック:ダイアログを表示\n左ドラッグ:ウィンドウを移動" bgscr 0,200,128,2,(ginfo_dispx-200)/2,(ginfo_dispy-150)/2: gsel 0,1 // 割り込み onclick gosub *click // クリックイベント onexit goto *exit // 終了処理 objsize 50,20: pos 142,8: button goto "×",*exit font "MS ゴシック",12 *loop1 // 通常ループ repeat 5,1 redraw 2 color 0,64,128: boxf: color 255,255,255 pos 10,10: mes "通常実行中 "+cnt+"/5"+b redraw 1 await 1000 if f { f=0: continue cnt } loop // deffunc内ループ loop2 goto *loop1 *click onclick 0 wait 5 // Vista 以降で必要?(稀に固まる) // 左ボタン if wparam=1 { sendmsg hwnd,$00a1,2,0 } // 右ボタン if wparam=2 { dialog "アプリを終了しますか?",2,APP_NAME if stat=6 { goto *exit } } onclick 1 f=1 return *exit dialog "end命令が実行されます。",0,APP_NAME // #deffunc loop2 を実行中に onclick で割り込み後にジャンプしてきた場合は終了できない // *click 内で onclick 0 をしているため onclick 無効のまま操作できなくなる end // こちらだと終了できる ;end: end // これでも終了できる ;PostQuitMessage 0: end // endがないとloop2が一瞬実行される // つまり1回目は無視され return と同じような挙動となっており // 2回目の end で終了できるということ #deffunc loop2 repeat 5,1 redraw 2 color 0,64,128: boxf: color 255,255,255 pos 10,10: mes "deffunc 内実行中 "+cnt+"/5"+b redraw 1 await 1000 // deffunc/defcfunc 内でウエイトを入れると不具合の原因に if f { f=0: continue cnt } loop return



この記事に返信する


窓月らら

リンク

2020/5/12(Tue) 20:18:19|NO.90412

上記追加です。
returnではなく、endをスルーして次のコードが実行されてるだけのようです。

dialog "!" #deffunc loop2
これを追加するとわかります。



ゆうやん

リンク

2020/5/13(Wed) 18:41:44|NO.90549

#deffuncだけでなく、onerror gosubでも発生するみたいですね。

onerror gosub *error mes 9/0;わざとエラーを発生させる。 stop *error onerror 0 dialog "エラーが発生しました。endを実行します。",1 end;endを実行するとサブルーチンが解除される。 return;サブルーチンが解除されてエラーが出る。



窓月らら

リンク

2020/5/15(Fri) 18:48:22|NO.90560

追加検証ありがとうございます。なるほど、やはりネスト関連ですね。
ネストが深かろうとendは問答無用で終了してくれると思ってたのですが
とりあえず、end: end で凌ぐしかなさそうです。



おにたま(管理人)

リンク

2020/5/26(Tue) 00:30:56|NO.90643

深いご指摘ありがとうございます。
まだ詳しく検証していませんが、修正時の参考にさせて頂きます。



ONION software Copyright 1997-2023(c) All rights reserved.