こんにちは、当方、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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
『ファイルを常時監視するメソッド(chkfile)の無限ループ内で』
と言う下りが気になりました。
ループ中に DoEvents やスリープが入っていると思いますが、
FileSystemObject のあるサブルーチンの中でずーとグルグル回っていることが、
メモリを食いつぶす原因かと思います。
何かのタイミングで Windows に制御を戻す事を考えてみてはどうでしょうか。
自分だったらタイマーを使って数ミリ秒に一回の監視を試みます。
不具合マシンの性能や Windows Update の当て具合、
サービスパックの入れ具合や、インストールしたソフトの悪影響も考えられますので、
欲を言えばテストするマシンの台数を増やして揉んで見る・・・と。
まあなんとも言えませんがあらゆる可能性がありますので、
色々検討してみて下さい。 ご健闘をお祈りします。
No.1
- 回答日時:
(1)オイラもそう思う。
でも、そうじゃない可能性を含め、終わったらnothingしたらいいんじゃない?
(2)よくわかんない。
でも、解決法が書いてあるから一旦、ローカル変数に格納してみたらいいんじゃない?
ついでに、ランタイム使っているなら、バージョンとかあわせて実験してみるのも良いかも。
くだらない回答してゴメンね。
でも(私には)、ソースコードないと問題特定はできないよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
VB6のメモリ解放に関して
Visual Basic(VBA)
-
メモリ不足
Visual Basic(VBA)
-
VB6でユーザー定義型がNothingかどうか調べるには?
Visual Basic(VBA)
-
-
4
VBプログラムの終了
Visual Basic(VBA)
-
5
メモリの解放の仕方
Visual Basic(VBA)
-
6
メモリの解放について VB6 VBA
Visual Basic(VBA)
-
7
Visual Basic 6.0 コンボボックスのChangeイベントが発生しません
Visual Basic(VBA)
-
8
VB6のユーザーコントロールがメモリを食う
Visual Basic(VBA)
-
9
VB6のプロジェクトロードエラーについて
Visual Basic(VBA)
-
10
実行時エラー7「メモリが不足しています」
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ディレクトリのサイズの取得
-
【VBA】複数CSVの特定範囲を1つ...
-
openglで音楽を再生する
-
0バイトのテキストファイル
-
Javaで名前付きパイプ
-
HTMLまたはJavaScriptでフ...
-
プロパティファイルで日本語を扱う
-
【Excel VBA】取り込んだファイ...
-
【VBA】印刷マクロのループ処理...
-
音声ファイルを他のHP経由で再...
-
ファイルのダウンロードが遅い
-
VBAで、JPG写真の撮影日時を読...
-
ファイルのアクセス権限について
-
VBS ファイルマージ処理
-
CreateFile関数を用いたファイ...
-
C# リッチテキストボックス...
-
文字コードについて(どのファ...
-
EUCコードをSHIFT-JISに変換したい
-
EXCELで複数のファイルを同じブ...
-
Eclipseで検索ができなくなった
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
0バイトのテキストファイル
-
VBAで、JPG写真の撮影日時を読...
-
HTMLテキストリンクでExcelファ...
-
Eclipseで検索ができなくなった
-
【VBA】複数CSVの特定範囲を1つ...
-
2GB以上のファイルを扱う方法
-
C++によるファイル送受信プログ...
-
VB6.0のメモリリークについて
-
vbaの構文の修正相談(xmlファ...
-
サイトマップにサブドメインを...
-
BASP21のファイルアップロード...
-
ディレクトリのサイズの取得
-
msgget()で指定するkey値について
-
ファイル更新日取得
-
main関数のコマンドライン引数...
-
<input type="file" で初期値...
-
C++.NET 2003 「空のドキュメ...
-
RPGでメッセージファイル利用
-
Indy FTP サーバー上のファイル...
おすすめ情報