C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■7546  Re[8]: VBSでストアドの戻り値
□投稿者/ 魔界の仮面弁士 -(2007/09/07(Fri) 17:15:57)
    No7534 (Mr.T さん) に返信
    > てっきり(*.VBS)なんだと思ってました。
    > ASPもチラとアタマに浮かんだのですが、VBSファイルでしょー?と...orz

    *.vbs をダブルクリックで実行している (あるいは、WScript.exe や CScript.exe からの実行) なら、
    かわりに *.wsf 経由で実行させてやれば、参照設定が行えます。


    ====== C:\test.vbs ======
    Option Explicit
    MsgBox adCmdStoredProc


    ====== C:\test.wsf ======
    <?xml version="1.0" encoding="Shift_JIS"?>
    <?component error="true" debug="true"?>
    <package>
    <job id="sample">

    <!-- ADO 2.8 のタイプライブラリを参照設定 -->
    <reference guid="{2A75196C-D9EB-4129-B803-931327F72D5C}" version="2.8"/>

    <!-- 同じフォルダ上の test.vbs をロードして実行 -->
    <script language="VBScript" src="test.vbs"></script>

    </job>
    </package>
    ========================
記事No.7497 のレス / END /過去ログ19より / 関連記事表示
削除チェック/

■91530  Re[6]: メモリリークに関して
□投稿者/ 魔界の仮面弁士 -(2019/07/03(Wed) 19:37:39)
    No91528 (kiku さん) に返信
    > その結果をどのように掲示板に報告するのが良いのか
    > ソースの内容を理解できていないため、
    > わかりませんでした。

    とりあえず、Compact か否かで結果が異なるという程度の理解でも可ということで。
    Fx と CFx で結果が異なることを確認しておきたかっただけです。
    (これも逆アセンブル扱いになるのだろうか…?)


    .NET Framework の場合、Reference Source を見れば、
    Form.Dispose(bool) が実装されていて、
    その中で、ContainerControl.Dispose(bool) が呼ばれていることがわかります。
    そしてそれが、Control.Dispose(bool) を呼び出していることも。
    https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs,3793


    一方 .NET Comapct Framwork の場合、ソースコードは提供されていませんが、
    No91525 の実験結果から、Form.Dispose(bool) は特に存在しておらず、
    直接 Control.Dispose(bool) がそのまま呼ばれていることが確認できました。



    No91529 (魔界の仮面弁士) に追記
    > あと、経験則的なところで言えば、.NET Compact Framework 環境の場合、
    > オブジェクトの使用後は、参照変数に Nothing 代入を積極的に行った方が良いみたいです。

    Nothing の代入有無で、本当に解放状況が変化するかどうかを確認してみました。


    端末を再起動して、空きメモリが十分に確保されている状態において、
    Button1 でモードレス フォームを表示させた後、
    Button2 でそれを Close させています。

    すると、Close 直後の ★の行の Nothing 代入がコメントアウトされていた場合、
    Form2 および LabelEx が直ちに Dispose されないケースが確認できました。

    しかし Nothing 代入するようにした場合は、Button2 の時点ですぐに Dispose されるようになりました。


    Partial Public Class Form1
      Inherits Form

      Private f As Form2 = Nothing

      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        f = New Form2()
        f.Show()
      End Sub

      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If f IsNot Nothing AndAlso Not f.IsDisposed Then
          f.Close()
          'f.Dispose()

          'f = Nothing  '★
        End If
      End Sub
    End Class

    Public NotInheritable Class LabelEx
      Inherits Label
      Public ReadOnly Id As Long
      Public Sub New()
        Id = Now.Ticks
        Trace.WriteLine(String.Format("==> {0} 生成 {1}", MyClass.GetType().Name, Id))
      End Sub
      Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        MyBase.Dispose(disposing)
        Trace.WriteLine(String.Format("<== {0} 破棄 {1} ({2})", MyClass.GetType().Name, Id, disposing))
      End Sub
    End Class

    Partial Public Class Form2
      Inherits Form
      Public ReadOnly Id As Long
      Public Sub New()
        Id = Now.Ticks
        InitializeComponent()
        Trace.WriteLine(String.Format("==> {0} 生成 {1}", MyClass.GetType().Name, Id))
      End Sub
      Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)
        Controls.Add(New LabelEx() With {.Text = .Id.ToString()})
        SendToBack()
      End Sub
      Private Sub Form2_Disposed(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Disposed
        Trace.WriteLine(String.Format("<== {0} 破棄 {1}", MyClass.GetType().Name, Id))
      End Sub
      Protected Overrides Sub OnDoubleClick(ByVal e As System.EventArgs)
        MyBase.OnDoubleClick(e)
        Close()
      End Sub
    End Class



    ただ、何度も実験を繰り返すと空きメモリが減ってくるようで、
    その場合はどうやら GC が発動するらしく、Nothing 代入せずとも
    Dispose される結果になるようです。
記事No.91509 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91529  Re[3]: メモリリークに関して
□投稿者/ 魔界の仮面弁士 -(2019/07/03(Wed) 19:14:23)
    No91518 (kiku さん) に返信
    >> For i = 0 To controlCollection.Count - 1
    >>  Dim control As Control = controlCollection(i)
    >>  control.Parent = Nothing
    >>  control.Dispose()
    >> Next
    >> .NET Compact Framework の実装については、上記に相当する処理を見つけることができませんでした。
    > なんと、これが直接的な原因みたいですね。

    Control.Dispose が上記を実装していれば、
    Form1 が Dispose される時に、Controls が再帰的に列挙され、
    Panel や Label といった子(あるいは子孫)コントロールも
    連動して解放されるはずなのですけれどね。


    とはいえ、GC 管理の仕組みがそもそも異なるので、
    .NET Framework 版との単純な比較はできません。
    (ソースコードは非公開ですし、逆アセンブルはライセンス上禁じられている…)

    実際 CE においても、親 Form が Dispose されれば、その配下のコントロール群も
    Dispose されることを確認できました。
    とはいえ、子コントロールの Dispose が確実に呼ばれているのか、
    たまたま GC されただけなのかまでは分かりません。

    一応、Dispose(False)時は、ApplicationThreadContext のファイナライズキューへの
    登録っぽい処理が行われると聞いたことがありますが、詳しいことは分からないです。


    CE 環境は Application.OpenForms でキャッシュされることが無いとは言え、
     (1) VB 特有の「My.Forms.フォーム名」プロパティでキャッシュされることはある
     (2) Form 右上の×を押しても Minimize されるだけ(Close/Dispose されるとは限らない)
    ということで、Dispose が呼ばれにくい状況に陥りやすそうではありますね。



    あと、経験則的なところで言えば、.NET Compact Framework 環境の場合、
    オブジェクトの使用後は、参照変数に Nothing 代入を積極的に行った方が良いみたいです。


    [宇宙仮面の研究室] - [Compact Framework のメモリ管理]
    https://uchukamen.wordpress.com/2007/01/23/compact-framework-%e3%81%ae%e3%83%a1%e3%83%a2%e3%83%aa%e7%ae%a1%e7%90%86/

    [SWK623] - [[.NET] WindowsMobile上のC#アプリのメモリリークを解決せよ!]
    https://swk623.com/2009/03/16/net-windowsmobile%E4%B8%8A%E3%81%AEc%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%9B%E3%82%88%EF%BC%81/

    [スラド] - [#1411305]
    https://srad.jp/comment/1411305


    基本的には、変数のスコープを抜ければ GC 対象にはなりそうですが、
    Module / Shared 等で保持されたインスタンスや、
    メインフォームのフィールド変数がもつ参照の場合は、
    変数の寿命が長くなるので、自分で管理するしか無さそう。
記事No.91509 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91532  Re[4]: メモリリークに関して
□投稿者/ kiku -(2019/07/04(Thu) 09:00:50)
    No91529 (魔界の仮面弁士 さん) に返信
    > 実際 CE においても、親 Form が Dispose されれば、その配下のコントロール群も
    > Dispose されることを確認できました。
    > とはいえ、子コントロールの Dispose が確実に呼ばれているのか、
    > たまたま GC されただけなのかまでは分かりません。

    子コントロールをすべて明示的にDisposeするように対応したいと思います。

    > あと、経験則的なところで言えば、.NET Compact Framework 環境の場合、
    > オブジェクトの使用後は、参照変数に Nothing 代入を積極的に行った方が良いみたいです。

    引用されているURLも一通り読んでみました。
    子コントロールにnullを設定するように対応したいと思います。
記事No.91509 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -