- PR -

ActiveReportsとページファイル

1
投稿者投稿内容
ASS
会議室デビュー日: 2005/12/13
投稿数: 2
投稿日時: 2005-12-13 10:59
はじめまして、よろしくお願いします。

VB.NET2003とActiveRepotsfor.NET(2.0ではありません)を使い、
サービスにて常時起動中の帳票印刷アプリの開発を行っているのですが、
半日ほど連続帳票作成を行いますと、ページファイルが1ギガを超えてしまい、
PCの動作が不安定となってしまいます。
アプリが使用するメモリ自体は、200メガ〜300メガを増えたり減ったりしていますので、
リソースの開放とガベージコレクションは正しく動作していると思うのですが・・・

以上です。よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-13 11:46
引用:

ASSさんの書き込み (2005-12-13 10:59) より:

アプリが使用するメモリ自体は、200メガ〜300メガを増えたり減ったりしていますので、
リソースの開放とガベージコレクションは正しく動作していると思うのですが・・・


増えたり減ったりしているから、リソースの管理が確実になされているとは限りませんよね。
帳票出力に問題があると推測されるなら、デバッグするしかないと思います。

# ソースが判らないので「ここがまずい」とも言えないのです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ASS
会議室デビュー日: 2005/12/13
投稿数: 2
投稿日時: 2006-01-17 17:25
返事が遅くなってしまい、申し訳ありませんでした。

あれから検証を更に重ねてみましたところ、じゃんぬねっとさんの仰るとおり、
リリース管理に穴があるようでメモリも増え続けていることが確認できました。

ソースの流れを簡単に書かせていただきますと、以下のようになります。
「rptRenraku」がActiveRepotのクラスです。

---------------------------------------

Dim rptReport As rptRenraku

Do While gintStatus = 1

 rptReport = New rptRenraku

 '---データ作成処理関数呼び出し
 Call subDataset()

 rptReport.Run()

 '---印刷処理
 rptReport.Document.Print(False, False, False)

 rptReport.Dispose()
 rptReport = Nothing

 '---スレッドの一時停止
 Thread.CurrentThread.Sleep(10000)

Loop

---------------------------------------


だいたいこのような感じです。
何かアドバイスなどいただければ幸いです。

以上です。よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-17 17:41
引用:

ASSさんの書き込み (2006-01-17 17:25) より:

Dim rptReport As rptRenraku

Do While gintStatus = 1

 rptReport = New rptRenraku

 '---データ作成処理関数呼び出し
 Call subDataset()

 rptReport.Run()

 '---印刷処理
 rptReport.Document.Print(False, False, False)

 rptReport.Dispose()
 rptReport = Nothing

 '---スレッドの一時停止
 Thread.CurrentThread.Sleep(10000)

Loop


繰り返しの処理があるのであれば、変数の有効範囲に注意してください。
正しく最適化すると以下のようなコードになるハズです。
(Dispose メソッドは確実に行われるように Finally に実装しています)

コード:

    ' [↓] ここって Integer ではなく Boolean の方が望ましいのでは?
    While (gintStatus = 1)
        Dim report As rptRenraku

        Try
            report = New rptRenraku()

            ' [↓] ここのせいである可能性もあります
            Me.subDataset()

            ' [↓] レポート クラス内が原因の可能性もあります
            report.Run()

            report.Document.Print(False, False, False)
        Finally
            If Not report Is Nothing Then
                report.Dispose()
            End If

            '/ これは不要 (回収の時期を早める効果はあるかもしれない)
            '/report = Nothing
        End Try

        System.Diagnostics.Thread.CurrentThread.Sleep(10000)
    End While


コメントとして記載していますが、このプロシージャが原因でない可能性もあります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)