プロが教えるわが家の防犯対策術!

こんにちは、当方、VB6.0を使用してアプリケーションを作成していますが、メモリリークが発生して困っています。

以下、プログラムのイメージになります。
ファイルを常時監視するメソッド(chkfile)の無限ループ内で、ファイルを取得するメソッド(getfile)を使用して、
ファイルを取得→変換する処理を行っています。
ファイルの取得方法は2パターンあり、1つ目は、任意の間隔(分単位)で機器と通信して取得する方法、
2つ目は共有フォルダを設定して置かれたファイルを取得する方法です。

現象としましては、数時間起動させておくとメモリを1GB程度使用してフリーズしてしまいます。
(エンドユーザーのPCで発生しており、当方の開発環境では確認しておりません。)

上記を踏まえ質問があります。
(1)自分でソースを追いかけ、調査を行ったところ、ファイルを取得するメソッド(getfile)内で、Scripting.FileSystemObjectを使用して
おり、以下の様に毎回インスタンスを生成しています。ですが、処理が終わった後、インスタンスの解放処理を行っていません。
 スコープが外れた場合、参照は自動的に消滅すると思っていますが認識は合っていますでしょうか?

 Dim fso As New Scripting.FileSystemObject

(2)「VB6.0 メモリリーク」のキーワードで検索したところ、UBoundについての記述を見つけることができました。
 Microsoftサポート 文書番号: 197190(http://support.microsoft.com/kb/197190/ja)

 ファイルを取得するメソッド(getfile)内で、UBoundを使用していますが、上記URLとは異なる使用方法です。
上記URLでの使用方法
UBoundのパラメータに配列の戻り値を指定する。

 作成したプログラムでの使用方法
指定したフォルダ内のファイルを取得するメソッド(getinfile)でbyrefキーワードに配列を指定して、その配列の要素数をforループの
 上限数に使用しています。

使用方法に問題はないと思うのですが、もしかして、UBoundを使用するのがまずいのでしょうか。

当然、予期せぬデータ等に対する不具合も疑いましたが、現象が発生した状態の変換元ファイルを使用して動作させたところ
問題はありませんでしたのでメモリリークを疑っている状態です。

A 回答 (2件)

『ファイルを常時監視するメソッド(chkfile)の無限ループ内で』


と言う下りが気になりました。

ループ中に DoEvents やスリープが入っていると思いますが、
FileSystemObject のあるサブルーチンの中でずーとグルグル回っていることが、
メモリを食いつぶす原因かと思います。

何かのタイミングで Windows に制御を戻す事を考えてみてはどうでしょうか。
自分だったらタイマーを使って数ミリ秒に一回の監視を試みます。

不具合マシンの性能や Windows Update の当て具合、
サービスパックの入れ具合や、インストールしたソフトの悪影響も考えられますので、
欲を言えばテストするマシンの台数を増やして揉んで見る・・・と。

まあなんとも言えませんがあらゆる可能性がありますので、
色々検討してみて下さい。  ご健闘をお祈りします。
    • good
    • 1

(1)オイラもそう思う。


でも、そうじゃない可能性を含め、終わったらnothingしたらいいんじゃない?
(2)よくわかんない。
でも、解決法が書いてあるから一旦、ローカル変数に格納してみたらいいんじゃない?

ついでに、ランタイム使っているなら、バージョンとかあわせて実験してみるのも良いかも。

くだらない回答してゴメンね。 
でも(私には)、ソースコードないと問題特定はできないよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています