秀丸メールを利用した監視システムについ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_GETCARE
TINDEX
        }
    }


    $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.co
m\\macro\\Aa1_CloudWatch監視_リカバリ監視\\Aa1_01_11_glue-driver-memory\\flg
作成.bat";
    }
///////////////////////////////////////////ここまで Aa1_01_11_glue-driver-me
mory_フラグ作成/////////

//ここから 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.co
m\\macro\\Aa1_CloudWatch監視_リカバリ監視\\Aa1_01_11_glue-driver-memory\\flg
削除.bat";
    }
///////////////////////////////////////////ここまで Aa1_01_11_glue-driver-me
mory_フラグ削除/////////


〜※上記フラグ作成、削除が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_CloudW
atch監視_メール監視_音声検知フォルダ★\\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_SET
CURSEL
    }




以上

メールボックスを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にすればいいです。run
sync/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つ目のメールボックスの追加後複数のr
unが実行される事象が発生しました。

------------------------------
 $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.co
m\\macro\\Aa1_CloudWatch監視_リカバリ監視\\Aa1_01_15_svpn-dlk-gn-001-bandwid
th\\flg削除.bat";
    }
///////////////////////////////////////////ここまで Aa1_01_15_svpn-dlk-gn-00
1-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\\Aa
2_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\\Ba
1_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\\Ca
1_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にするとか、またはそもそも外部プログラム
を使うのやめてマクロだけでなんとかしてみる(マクロで出来ない処理はとりあえず
省略する)などして、それでどうかテストするなどして何が悪いのか原因究明するの
がいいんじゃないかと思います。

[ ]