Menu

#164 WSHマクロの中断

closed
nobody
None
5
2012-11-09
2011-07-21
syat
No

無限ループなどで終わらなくなったマクロを中断します。

具体的な動きは、
・マクロ実行開始と同時に停止用のスレッドを起動
・停止用のスレッドは5秒待つ
・5秒待っても終了していなければ停止確認のメッセージボックスを表示
  はい → マクロ実行を中断する
  いいえ → 中断せず最後まで実行

Discussion

  • syat

    syat - 2011-07-21
     
  • Moca

    Moca - 2011-07-23

    ダイアログやすべて置換・外部コマンド実行などで5秒の制約はきつすぎると思います。
    OFFにするオプションか経過時間を設定できるようにしないと
    人によっては毎回表示されるではないでしょうか。

     
  • syat

    syat - 2011-07-24

    たしかにメッセージボックス表示系だと毎回出ちゃいそうですね。
    しかもスクリプトではなくサクラ内の処理だからすぐに止まらないし。。。

    ・時間の延長(15秒くらい?)
    ・待ちループ内ではサクラのコマンド実行中ならカウントしない
    ・OFFにするオプション追加
    の方針で修正してみます。

    マクロ終了時に停止メッセージが勝手に閉じてくれれば、あまり気にならないのかも?

     
  • syat

    syat - 2011-08-05

    マクロ終了後勝手に閉じる。表示までの時間を共通設定に(デフォ10秒)。

     
  • syat

    syat - 2011-08-05

    少し修正してみました。
    WshMacroInterrupt_U2.patch

    停止ダイアログをCDlgCancelを使うようにして、マクロの実行終了時に勝手に閉じるようにしました。
    ダイアログは別スレッド内でメッセージループを回して表示しています。
    親ウィンドウはNULLにしています。エディタを指定すると、エディタ内で考え込んでしまったときに確認ダイアログが表示されないので。

    また、表示するまでの待ち時間を共通設定「マクロ」に追加しました(デフォルト10秒)。ダイアログがじゃまな人はここを999とかにすれば良いので、無効/有効の切り替えは付けていません。

    サクラコマンド実行中は待ちカウントしない機能は、一度作ったものの、イケてない気がしたので外しました。
    私がこの機能を使いたいシーンの一つは「マクロのコーディングミスで、うっかり無限ループにしてしまった」場合です。
    例えば以下のようなコーディングをしてしまったとき、メッセージボックスをカウント対象外にすると、いつまでも停止ダイアログが出てくれず、歯がゆい。。
     while ( 1 ) {
      if ( まちがって常にfalseな条件 )
       break;
      MessageBox("ここにはこないはず");
     }
    外部コマンド実行のように、実行中はいつも出てしまうものです、という仕様もありかなと思うのです。
    マクロ上級者向けに、停止ダイアログを抑制する関数はあってもよいかな?

     
  • syat

    syat - 2012-09-25

    リビジョン2365でコミットしました。

     

Log in to post a comment.