[ 新規に投稿する ]

秀丸メールを利用した監視システムについてNo.13392
maedamaeda0911 さん 25/04/01 15:24 [ コメントを投稿する ]
お世話になっております。

秀丸メールを利用した監視システムを秀丸マクロで作成しています。

【問題】同時に複数のメールを受信した場合に全く関係のない秀丸マクロ内のrunが実行されてしまう。



秀丸マクロの構成は以下の通りです。


loaddll "TKInfo.dll";

////////■■ここから_選択しているフォルダを記憶■■///////////////
 #n = dllfunc("SetGrepFolderAutoInvalidate", 0);

    //メールの位置取得
    #index = dllfunc("MailIndex");
    #listindex = -1;
    if( #index < 0 ) {
        #listwnd = dllfunc("TitleListWnd");
        if( #listwnd != 0 ) {
            #listindex = sendmessage( #listwnd, 0x019F, 0, 0 ); //LB_GETCARETINDEX
        }
    }


    $folder = dllfuncstr("CurrentFolder");
    //#n = dllfunc("SelectFolder", "", "受信");
    #n = dllfunc("SelectFolder", "", $folder);
////////■■ここまで_選択しているフォルダを記憶■■///////////////

/////////////////////////////////■■ここから Aa1_01リカバリ監視■■/////////////////////////////////////////////////




//ここから Aa1_01_11_glue-driver-memory_フラグ作成///////////////////////////////////////////
    #n = dllfunc("SelectFolder", "","受信\\Aa1_01_CloudWatch監視_リカバリ監視\\Aa1_01_11_glue-driver-memory\\Aa1_01_11_glue-driver-memory_alarm");
    #n = 0;
    #n = dllfunc("RecvMailCountInFolder");
    if( #n != 0 ) {
                      run "C:\\TuruKameData\\xxxxxxxxxxxxxxx@namurainfo-s.com\\macro\\Aa1_CloudWatch監視_リカバリ監視\\Aa1_01_11_glue-driver-memory\\flg作成.bat";
    }
///////////////////////////////////////////ここまで Aa1_01_11_glue-driver-memory_フラグ作成/////////

//ここから Aa1_01_11_glue-driver-memory_フラグ削除///////////////////////////////////////////
    #n = dllfunc("SelectFolder", "","受信\\Aa1_01_CloudWatch監視_リカバリ監視\\Aa1_01_11_glue-driver-memory\\Aa1_01_11_glue-driver-memory_ok");
    #n = 0;
    #n = dllfunc("RecvMailCountInFolder");
    if( #n != 0 ) {
                      run "C:\\TuruKameData\\xxxxxxxxxxxxxxx@namurainfo-s.com\\macro\\Aa1_CloudWatch監視_リカバリ監視\\Aa1_01_11_glue-driver-memory\\flg削除.bat";
    }
///////////////////////////////////////////ここまで Aa1_01_11_glue-driver-memory_フラグ削除/////////


〜※上記フラグ作成、削除が15セット

/////////////////////////////////■■ここから Aa1_02_メール監視■■/////////////////////////////////////////////////
    #n = dllfunc("SelectFolder", "","受信\\Aa1_02_CloudWatch監視_メール監視_音声検知フォルダ★");
    #n = 0;
    #n = dllfunc("RecvMailCountInFolder");
    if( #n != 0 ) {
  run "C:\\TuruKameData\\xxxxxxxxxxxxxxx@namurainfo-s.com\\macro\\Aa2_CloudWatch監視_メール監視_音声検知フォルダ★\\alarm.bat";
    }
/////////////////////////////////■■まで Aa1_02_メール監視■■/////////////////////////////////////////////////

〜※音を鳴らす部分である上記が6セット




   //メールの位置復元
    if( #index >= 0 ) {
        #n = dllfunc("SetMailIndex", #index);
    } else if( #listindex >= 0 ) {
        message str(#listindex);
        #n = sendmessage( #listwnd, 0x0186, #listindex, 0 );        //LB_SETCURSEL
    }




以上

メールボックスを2つ使用しています。
振り分け先やbatの文字数の多さでうまく動かないことがあります。
現在は上記複数受信時のみ別の振り分け先アラートが4〜5か所まとめてアラートが発生します。


基本的なマクロの記述におかしい場所があればご教授願います。




---以下の内容はコミュニテックス会議室システムにより付加されました。
本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。
[ ]
RE:13392 秀丸メールを利用した監視システムについてNo.13394
秀まるお2 さん 25/04/02 00:04 [ コメントを投稿する ]
  秀丸マクロは同時に1つしか実行されないので、run文が複数同時実行されてることは無いと思います。複数同時実行は無いと思いますが、run文が連続実行されることで、結果的に起動された側のプログラムが複数同時実行してる状態になってるのかなぁと思います。

例えば秀丸マクロでrun文を1秒間隔で実行したとして、runで起動されたプログラムが終了するまで3秒かかるとしたら、1秒後には2つ、2秒後には3つのプログラムが並行動作するような、そんな感じにはなると思います。

並行して実行されないようにするならrunsyncまたはrunsync2にすればいいです。runsync/runsync2だと、起動されたプログラムが終了するまでマクロも待機されます。

例えば

    run "notepad.exe";
    run "notepad.exe";
    run "notepad.exe";

のようにするとメモ帳が3つ起動しますが、

    runsync2 "notepad.exe";
    runsync2 "notepad.exe";
    runsync2 "notepad.exe";

だと、1つめに起動されたメモ帳を終了するまで2つ目のrunsync2は実行されずに待機状態になり、結果的にメモ帳が並行して起動することは無くなります。

run文で実行してるのが何か分からないのですが、とりあえずrunをrunsync2する作戦をお勧めしたいです。
[ ]
RE:13394 秀丸メールを利用した監視システムについてNo.13395
秀まるお2 さん 25/04/02 08:31 [ コメントを投稿する ]
  もしも「新着メールが1通でもあったらrun文を1回だけ実行する」ってことでいいなら、

    #needrun = 0;
    while(1) {
       ...
       ...
       if( ...runが必要なら... ) {
           #needrun = 1;
       }
   }

   if( #needrun != 0 ) {
       run "......";
   }

みたいにすればいいと思います。
[ ]
RE:13395 秀丸メールを利用した監視システムについてNo.13396
maedamaeda0911 さん 25/04/02 18:13 [ コメントを投稿する ]
>もしも「新着メールが1通でもあったらrun文を1回だけ実行する」ってことでいいなら、
> ......
>みたいにすればいいと思います。


早速のご回答ありがとうございますTT
大変助かります。
runについては複数のメールがそれぞれの振り分け先に受信した場合は複数のrunを実行したいです。〜の振り分け先に受信しましたのようなログ出力をしています。
1通受信すると対象の振り分け先に受信していないにもかかわらず何も受信指定内振り分け先のrunが実行されます。


[ ]
RE:13396 秀丸メールを利用した監視システムについてNo.13398
秀まるお2 さん 25/04/03 08:59 [ コメントを投稿する ]
  runを複数実行しないといけないなら、runの所をrunsync2に変更すればいいんじゃないかと思います。それか、runで実行されるプログラムが並行実行されても大丈夫なようにするか。

ログ出力したいだけなら、別に外部のプログラムを呼び出さなくてもマクロでも出来ると思います。tkinfo.dllにSaveStringToFileって関数があるので、例えば

    #n = dllfunc("SelectFolder", "","受信\\フォルダ1");
    #n = dllfunc("RecvMailCountInFolder");
    if( #n != 0 ) {
        $file = "C:\\ログ\\フォルダ1ログ.txt";
        #n = dllfunc("SaveStringToFile"
                    , $file         //保存するファイル名
                    , dllfuncstr("CurrentDate", "YYYY/MM/DD hh:mm:ss") + "\r\n" //書き込む文字列
                    , 1             //追加書き込みなら1
                    , 1             //エンコード種類 = UTF-16
                    );
    }

みたいな処理にしてもいいんじゃないかと思います。
[ ]
RE:13398 秀丸メールを利用した監視システムについてNo.13401
maedamaeda0911 さん 25/04/03 10:03 [ コメントを投稿する ]
>runを複数実行しないといけないなら、runの所をrunsync2に変更すればいいんじゃないかと思います。それか、runで実行されるプログラムが並行実行されても大丈夫なようにするか。
> ......
>みたいな処理にしてもいいんじゃないかと思います。


回答ありがとうございます。
ログ出力の他にファイル作成や音を鳴らす処理も実施しています。
調査しているとマクロ冒頭の受信前の選択しているメールを記憶して最終的に選択していたメールを選択させてあげるといった部分が全く理解できておらず誤ったコードになっており意図した動作をしていませんでした。そのため発生していた事象かもしれません。

回答に別途質問となってしまい申し訳ございません。

現在はシンプルに以下のような形にしておりますがコードの内容に特に問題はないでしょうか。
また二つのメールボックスを使用しており、2つ目のメールボックスの追加後複数のrunが実行される事象が発生しました。

------------------------------
 $folder = dllfuncstr("CurrentFolder");


〜〜※振り分け先に受信した場合flg作成batやalarm発生batの実行〜〜
//ここから Aa1_01_15_svpn-dlk-gn-001-bandwidth_フラグ削除///////////////////////////////////////////
    #n = dllfunc("SelectFolder", "","受信\\Aa1_01_CloudWatch監視_リカバリ監視\\Aa1_01_15_svpn-dlk-gn-001-bandwidth\\Aa1_01_15_svpn-dlk-gn-001-bandwidth_ok");
    #n = 0;
    #n = dllfunc("RecvMailCountInFolder");
    if( #n != 0 ) {
                      run "C:\\TuruKameData\\xxxxxxxxxxxxxxx@namurainfo-s.com\\macro\\Aa1_CloudWatch監視_リカバリ監視\\Aa1_01_15_svpn-dlk-gn-001-bandwidth\\flg削除.bat";
    }
///////////////////////////////////////////ここまで Aa1_01_15_svpn-dlk-gn-001-bandwidth_フラグ削除/////////


/////////////////////////////////■■ここから Aa1_02_メール監視■■/////////////////////////////////////////////////
    #n = dllfunc("SelectFolder", "","受信\\Aa1_02_CloudWatch監視_メール監視_音声検知フォルダ★");
    #n = 0;
    #n = dllfunc("RecvMailCountInFolder");
    if( #n != 0 ) {
          run "C:\\TuruKameData\\xxxxxxxxxxxxxxx@namurainfo-s.com\\macro\\Aa2_CloudWatch監視_メール監視_音声検知フォルダ★\\alarm.bat";
    }
/////////////////////////////////■■まで Aa1_02_メール監視■■/////////////////////////////////////////////////




/////////////////////////////////■■ここから Ba1_01_Budgets監視(コスト監視)_音声検知フォルダ★■■/////////////////////////////////////////////////
    #n = dllfunc("SelectFolder", "","受信\\Ba1_01_Budgets監視(コスト監視)_音声検知フォルダ★");
    #n = 0;
    #n = dllfunc("RecvMailCountInFolder");
    if( #n != 0 ) {
          run "C:\\TuruKameData\\xxxxxxxxxxxxxxx@namurainfo-s.com\\macro\\Ba1_Budgets監視(コスト監視)_音声検知フォルダ★\\alarm.bat";
    }
/////////////////////////////////■■まで Ba1_01_Budgets監視(コスト監視)_音声検知フォルダ★■■/////////////////////////////////////////////////




/////////////////////////////////■■ここから Ca1_01_Health監視_音声検知フォルダ★■■/////////////////////////////////////////////////
    #n = dllfunc("SelectFolder", "","受信\\Ca1_01_Health監視_音声検知フォルダ★");
    #n = 0;
    #n = dllfunc("RecvMailCountInFolder");
    if( #n != 0 ) {
          run "C:\\TuruKameData\\xxxxxxxxxxxxxxx@namurainfo-s.com\\macro\\Ca1_Health監視_音声検知フォルダ★\\alarm.bat";
    }
/////////////////////////////////■■まで Ca1_01_Health監視_音声検知フォルダ★■■/////////////////////////////////////////////////







 #n = dllfunc("SelectFolder", "", $folder);







---以下の内容はコミュニテックス会議室システムにより付加されました。
本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。
[ ]
RE:13401 秀丸メールを利用した監視システムについてNo.13402
秀まるお2 さん 25/04/03 10:38 [ コメントを投稿する ]
  まず、マクロ実行前に選択してたメールをマクロ実行後にもそのままにしたい場合の処理は、LB_GETCARETINDEXをsendmessageするみたいな処理にするのは危険なので、以下のようにしたらいいと思います。

---------------------------------------------------------------------------------
選択状態を保存する処理:
    $prevAccount = dllfuncstr("CurrentAccount");
    $prevFolder = dllfuncstr("CurrentFolder");
    #prevThreadView = dllfunc("IsThreadView");
    if( #prevThreadView != 0 ) {
        #n = dllfunc("SetThreadView", 0);
    }
    #prevIndex = dllfunc("MailIndex");


選択状態を復元する処理:

    #n = dllfunc("SelectFolder", $prevAccount, $prevFolder);
    #n = dllfunc("SetMailIndex", #prevIndex);
    #n = dllfunc("SetThreadView", #prevThreadView);
---------------------------------------------------------------------------------

> ログ出力の他にファイル作成や音を鳴らす処理も実施しています。

音を鳴らすのはplayまたはplaysyncで出来ます。

    play "c:\\wave\\testwave.wav";

みたいな感じで。

繰り返しになりますが、runをrunsync2にするとか、またはそもそも外部プログラムを使うのやめてマクロだけでなんとかしてみる(マクロで出来ない処理はとりあえず省略する)などして、それでどうかテストするなどして何が悪いのか原因究明するのがいいんじゃないかと思います。
[ ]

[ 新規に投稿する ]