一定時間待つマクロNo.36929
おじさん さん 09/08/30 22:25
 
秀丸メールマクロで、所定の時間(0.1〜10秒ぐらい)待つためにはどのようにすれば
よいでしょうか。

具体的には、メール本文から URL らしき文字列を検索、配列に収納(最大20個程度)し、
最後にまとめて、配列に収納した URL を internet explorer で開くようにしたいの
ですが、
まとめて開く数が多いと、IE(Ver.8) がサーバにつながらないエラーになってしまい
ます。

// $Urls[ 0 .. (#NumUrls-1) ] は "http://www.hogehoge.com/xx.html" といった
文字列
#i = 0;
while( #i < #NumUrls ){
        openbyshell "\"" + $Urls[#i] + "\"";
        // ここで0.5秒ぐらい待ちたい
        #i = #i + 1;
}

以上、よろしくお願いいたします。

[ ]
RE:36929 一定時間待つマクロNo.36930
Iranoan さん 09/08/31 01:29
 
 おじさんさん今日は、Iranoan です。
>         // ここで0.5秒ぐらい待ちたい
 ここに、末尾のマクロを入れれば出来ますが、CPU パワーはしっかり使います(^^)。
//------------------------------------------------------------
#tickcount = tickcount;
while( 1 ){
  if( ( tickcount - #tickcount ) / 100 > 5 )break;
}

[ ]
RE:36930 一定時間待つマクロNo.36931
Kamonohasi さん 09/08/31 01:57
 
こんばんは、選挙番組で夜更かししたカモノハシです。

流石に、無限ループはきついんじゃないでしょうか。たぶん、以下のどれかがいいか
と。
・DDE の ddewaitadvice を使う。
・外部DLLを使う。
・(8β以降なら)WSHのSleepを使う。
・runsync を使って、↑のスクリプトを使う。
・runsync を使って、バッチファイルから、pingのタイムアウトを使う。

あと、IEは詳しくないので、できないのかもしれませんが、SendMessageで、読み込
み完了しないと、帰ってこない値を取得できませんか?
できるなら、3つづつくらい一度に開いて、1つ目が読み込み終わったら、次ってする
とか?

外してたら済みません。

[ ]
RE:36931 一定時間待つマクロNo.36932
秀まるお2 さん 09/08/31 09:17
 
 Iranoanさんのやり方で普通は大丈夫だと思います。

    #tick = tickcount;
    while( tickcount - #tick < 500 ) {
        //
    }

 みたいにします。

[ ]
RE:36932 一定時間待つマクロNo.36940
おじさん さん 09/09/02 00:50
 
みなさま、ありがとうございます。

教えていただいた方法を試してみました。

確かに、所定の時間待ってくれるのですが、
その間CPUがTurukame側で100%近く食ってしまって、
IE側で仕事が進まず、
結局処理しきれないままです。
(waitを入れないときとあまり変わず)

今時シングルコアのPentiumなんか使っているのが
いけないのかもしれませんが...。

教えてクンで申し訳ありませんが、
CPUを食わないで待つ方法はないものでしょうか?

[ ]
RE:36940 一定時間待つマクロNo.36941
colder さん 09/09/02 01:01
 
田楽DLLを使う方法

loaddll "tkinfo.dll";
// ...
#d = dllfunc("LoadDll", "dengakudll.dll");
if(!#d) {message "田楽がない"; }
else
{
    $s = dllfuncstr("DllFunc", #d, "GETVERSION");
    #major = val(leftstr($s,1));
    #minor =  val(midstr($s,2,2));
    if(!((#major > 2)||(#major == 2 && #minor >= 70)))
      { message "田楽のヴァージョンが古い"; }
    else
      { #n = dllfunc("DllFunc", #d, "SLEEP", 500); }
    #n = dllfunc("FreeDll",#d);
}
// ...
freedll;

[ ]
RE:36940 一定時間待つマクロNo.36942
Iranoan さん 09/09/02 01:12
 
 おじさんさん今日は、Iranoan です。
> 教えてクンで申し訳ありませんが、
 カモノハシさんの仰る
> ・DDE の ddewaitadvice を使う。
> ・外部DLLを使う。
> ・(8β以降なら)WSHのSleepを使う。
> ・runsync を使って、↑のスクリプトを使う。
> ・runsync を使って、バッチファイルから、pingのタイムアウトを使う。
のどれかに成ります。二つ目が秀丸メールに取り込まれるのは遥か先でしょう
から、他の方法が現実的です。
 どれにするかは、「おじさんさんの得意な方法で」ということになるかと。

[ ]
RE:36940 一定時間待つマクロNo.36943
K'zawa さん 09/09/02 01:37
 
おじさんさん、こんにちは。
K'zawaです。

ddewaitadvice "", 500;  // 500ms待つ

[ ]
RE:36940 一定時間待つマクロNo.36944
秀まるお2 さん 09/09/02 08:49
 
 ddewaitadviceするだけでウェイト出来るとは僕も知りませんでした。それか
一番簡単そうな気がします。

 一応他のアイデアも出しておくとですが、秀丸メールのtkinfo.dllにある、
SetAutoPushTimerMilli関数を使う方法もあります。

    loaddll "tkinfo.dll";
    #n = dllfunc("SetAutoPushTimerMilli", 500, "");
    message "ウェイト中";

 です。画面上に「ウェイト中」のメッセージが出るのがじゃまですけど、この
方法ならメッセージループも回るのでIEの処理が先に進みやすくていいかもしれ
ません。

[ ]
RE:36940 一定時間待つマクロNo.36946
おじさん さん 09/09/03 00:25
 
みなさまありがとうございます。
完璧!です。
IE側も無事動作しました。

■ddewaitadvice を使う方法
こんな簡単な方法があったのですね。
マクロのヘルプや過去ログを探したつもりでしたが、
私の力では見つけきれませんでした。

■SetAutoPushTimerMilli を使う方法
waitの間、ポップアップが出るのがいいです。
デバッグ中や verbose mode に
この方法を使いたいと思います。

■田楽dll を使う方法
これもなんの問題もなく動作しました。
が、グループで共通に利用する関係上、
田楽dllを入れていない人や
別(旧)バージョンを入れている人がいる可能性があることから、
今回は別の方法をとらせていただくことにしました。

回答いただいた皆さま。本当にありがとうございました。

[ ]