スクリプトの実行で異常が起こるNo.04274
Makkie さん 13/09/19 17:23
 
秀丸ファイラーご担当殿

秀丸ファイラー1.04 32bit(Windows7 64bit)のユーザです。

スクリプト(JScript)を実行するときですが、今、あるスクリプトで
困った問題が起こっています。

(1)秀丸ファイラーのメッセージ

        以下のパスを開くときにタイムアウトしました(3000ms)
        ・・・・・・・(パス名)・・・・・・・・・・・・・
                                [再試行]  [キャンセル]

      が出る。

   ・再試行ボタンで継続される。

   ・メッセージに表示されるパスはローカルフォルダのパスであっ
      て、何らかのタイムアウトになることは考えられない。誰か(ア
      プリ)が握っているパスでもない。秀丸ファイラーの画面からは
      問題なく開けるパス。

(2)GetItemCount()で返されるアイテム数が実態とは違っている。今
      開いているフォルダのアイテム数ではなく、どうも、一つ上位の
      フォルダ(=今開いているフォルダの前に開いていたフォルダ)
      のアイテム数のようだ。

(3)(1)と(2)はスクリプトの同一の実行で起こることもある
        が、独立しても起こる。

(4)(1)と(2)の再現性はない。ただし、特定のスクリプトで特
        定の使い方をすると、必ずではないが、頻発する。

      「特定の使い方」とは、スクリプトのOpen()で、多数のフォルダ
      を順次開く動作を短時間に繰り返すような使い方(と考えられ
      る。これが真に影響しているかどうかは分からないが)。多数と
      は400個程度。100個程度で起こったことはないと思う。

コンパクトな再現環境を作れる自信はありません。何かわかりますか?

[ ]
RE:04274 スクリプトの実行で異常が起こるNo.04276
秀丸担当 さん 13/09/20 09:57
 

バグ情報ありがとうございます。

確実な再現性がないということで原因を探るのが難しそうではありますが、おそ
らく秀丸ファイラーClassicの処理の幾つかが非同期的に行われていることに起
因するのという気がします。

Openを繰り返すと早く応答が返ったように見えますが、バックグラウンドで開始
していた処理を中断し、新たなバックグラウンドの処理を作るということになり、
場合によってはバックグラウンドの処理が幾つも並行していることがあると思い
ます。
それでディスクのキャッシュや並行した処理の具合でタイムアウトになることが
ある可能性も考えらると思います。
関連するプロパティ/メソッドとして、Busyプロパティと、Sleepメソッドがあり
ます。

こちらで幾つか試してみた限りではいまのところうまく再現できないのですが、
Busyの場合はSleepするようにして同期的に処理できるようにするとうまくいき
やすくなると思いますが、どうでしょうか。

スクリプトの例:
Open(strPath);
for(i=0;i<cLimit;i++){
  if(Busy==0)break;
  Sleep(30);
}

[ ]
RE:04274 スクリプトの実行で異常が起こるNo.04277
秀丸担当 さん 13/09/20 16:24
 

いろいろ確認してみたところ、Busyのチェックに相当することがOpenした直後に
は3秒までは自動的に行われていて、あまり効果はなさそうです。
より確実な同期的な処理ができるように次のβ版で修正してみます。

[ ]
RE:04277 スクリプトの実行で異常が起こるNo.04280
Makkie さん 13/09/21 11:47
 
Busyを判定しSleepを入れるのでは、症状は改善しませんでした。

(たぶん)再現可能なコンパクトなスクリプトができたので、貼り付け
ます。配下のフォルダの数が数千(たとえば秀丸メールのホームディレ
クトリ)をアクティブなフォルダにして実行してみてください。このス
クリプトに実用上の意味はありません。

私の環境では
  ・タイムアウトのメッセ―ジが出る。
  ・結果のメッセージがおかしい(実態と違う)
のどちらか、または両方になります。

Windows7 64bit 秀丸ファイラー32bitです。

よろしくお願いします。

//-----------------------------------------------------
// 配下のフォルダ総数をメッセージ出力 (max 500で中断)
Message(COUNT(GetDirectory()));
EndMacro();
function COUNT(dir) {
  var n=GetItemCount();
  var c=0;
  for(var i=0; i<n; i++) {
    if(IsFolder(i)) {
      c++;
      var down=GetItemPath(i);
      Open(down,0,0,1);
      c+=COUNT(down);
      ExpandFolder(down,0x02);
      Open(dir,0,0,1);
      if(c>500) return c;
    }
  }
  return c;
}
//-----------------------------------------------------

[ ]
RE:04280 スクリプトの実行で異常が起こるNo.04286
秀丸担当 さん 13/09/24 11:01
 

詳しいスクリプトなどありがとうございます。
スクリプトで試してみたところ、タイムアウトにはなりませんでしたが、Openが
時間差でうまくいかない場合などがあることが確認できました。
いまのところ原因は調査中でつかめていませんが、再現できるおかしい点を調べ
て修正させていただきます。

[ ]
RE:04286 スクリプトの実行で異常が起こるNo.04332
Makkie さん 13/10/11 21:20
 
1.06b6でやってみました。

タイムアウトは全く発生しなくなりました。

但し、GetItemPath()でnull文字が返されるという現象が起きます。
1.05でもこれに類する現象が起きたと記憶しています。

再現のためのスクリプトを張り付けます。null文字が返されると途中
でスクリプトが停止します。

配下のフォルダ数が大量で階層が深いディレクトリで実行すると、かな
りの頻度で発生します。スクリプトが停止する場所は一定していません
(その意味では、再現性はない)。

よろしくお願いします。

// 配下のフォルダ総数を調べる(最大500)V2---------------
Message("Number of Folder = "+COUNT(GetDirectory()));
EndMacro();
function COUNT(dir) {
  var n=GetItemCount();
  var c=0;
  for(var i=0; i<n; i++) {
    var item=GetItemPath(i);
    if(item=="") {
      Message("GetItemPath("+i+") is null\nDIR = "+dir+
              "\nGetItemCount = "+n,16);
      EndMacro();
    }
    if(IsFolder(i)) {
      c++;
      Open(item,0,0,1);
      c+=COUNT(item);
      ExpandFolder(item,0x02);
      Open(dir,0,0,1);
      if(c>500) return c;
    }
  }
  return c;
}
// ------------------------------------------------------



[ ]
RE:04332 スクリプトの実行で異常が起こるNo.04335
秀丸担当 さん 13/10/15 14:58
 

ご確認ありがとうございます。
また別の問題があるということですみません。
V1.06β6で試してみたところでは、秀丸メールのデータフォルダなどでほぼ確実
に再現しました。
V1.06β7で前からあったウィンドウが応答なし状態になることの改善も行ってい
て、こちらではほぼ再現しなくなっていました。
現在の最新のV1.06β9で一回再現できた気がしたのですが、もし問題になりそう
な場合でも内部的に再試行するような対策も入れさせていただきます。

[ ]
RE:04335 スクリプトの実行で異常が起こるNo.04355
Makkie さん 13/10/22 19:10
 
V1.06β10でGetItemPathの問題は、全く発生しなくなりました。
ご報告まで。

>
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>な場合でも内部的に再試行するような対策も入れさせていただきます。

[ ]