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

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

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

全過去ログを検索

<< 0 >>
■29401  Re[14]: CSVで取得した値を1行ずつ表示。
□投稿者/ みきぬ -(2008/12/09(Tue) 11:58:45)
    No29388 (επιστημη さん) に返信
    >>使うにしろ使わないにしろCSVよかアクセスやSQLさばのほうが
    >>いいとおもいますけど。
    >
    > ストレージとファイル・フォーマットを同列に扱っちゃイカンでしょ。

    すいません、ここ解説希望です。
    ストレージって何を指してますか?
記事No.29342 のレス /過去ログ53より / 関連記事表示
削除チェック/

■31814  Re[3]: 集計結果によっては処理中断
□投稿者/ ニッパー -(2009/01/29(Thu) 10:12:05)
    やじゅ様が書いていただいたTables[0].Rowsをヒントに
    探してみたところ、データテーブルのヘルプで糸口がつかめました。
    このように記入したところ希望していた動作を作ることができました。
    ありがとうございました。
    ※ D_tableはデータテーブル。
    
    If D_table.Rows.Count = 0 Then
     MessageBox.Show("データがありません")
    Else
     Dim The_REPORT As New CrystalReport1
      The_REPORT.SetDataSource(D_table)
      CrystalReportViewer1.ReportSource = The_REPORT
    
    End If
記事No.31795 のレス / END /過去ログ56より / 関連記事表示
削除チェック/

■77957  Re[5]: メモリを上回るデータをソート
□投稿者/ メモリ節約し隊 -(2015/12/03(Thu) 23:22:58)
    みなさまありがとうございます。
    構造の再検討が必要ですね。
記事No.77935 のレス / END /過去ログ132より / 関連記事表示
削除チェック/

■91525  Re[4]: メモリリークに関して
□投稿者/ 魔界の仮面弁士 -(2019/07/03(Wed) 17:07:14)
    No91519 (WebSurfer さん) に返信
    > Form コントロールの場合、Dispose(), Dispose(bool) の実装は Control toha違うようです。
    > 下のリンクをクリックして画像を見てください。
    > http://surferonwww.info/BlogEngine/image.axd?picture=2019%2f7%2fFormDispose0.jpg

    Dispose の実装は、Label と Form で差異が無さそうに見えます。
    少なくとも .NET Compact Framework においては。


    手元の VS2008 環境で、Form1 の継承関係をたどってみました。
    CE 機が無いので、エミュレーターでの動作ですけれども。


     × は Dispose(boolean) が実装されていないクラス
     ※ は Dispose(boolean) が派生元にあるが、実装しなおしてないクラス
     ☆ は Sub Overrides Dispose(boolean) として実装しなおされているクラス
     ★ は Sub Overridable Dispose(boolean) として最初に実装されているクラス


    .NET Compact Framework の場合

    × Object
    └× MarshalByRefObject
     └★ Component
      └☆ Control
       └※ ScrollableControl
        └※ ContainerControl
         └※ Form
          └☆ Form1


    .NET Framework の場合

    × Object
    └× MarshalByRefObject
     └★ Component
      └☆ Control
       └☆ ScrollableControl
        └☆ ContainerControl
         └☆ Form
          └☆ Form1



    Imports System.Reflection

    Public Class Form1
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListBox1.DataSource = New Type(-1) {}
        ListBox1.DisplayMember = "Name"
        ListBox2.DataSource = New Type(-1) {}
        ListBox2.DisplayMember = "Name"
        ComboBox1.DataSource = New Type() { _
          GetType(Form1), _
          GetType(Form), _
          GetType(Label), _
          GetType(Panel), _
          GetType(Control) _
        }
        ComboBox1.DisplayMember = "FullName"
        TextBox1.Text = "Dispose"
        CheckBox1.Checked = True
      End Sub

      Private Sub Analyze(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged, CheckBox1.CheckStateChanged, TextBox1.TextChanged
        Analyze()
      End Sub

      Private Sub Analyze()
        Dim selType As Type = DirectCast(ComboBox1.SelectedItem, Type)
        Dim methodName As String = TextBox1.Text
        Dim declaredOnly As Boolean = CheckBox1.Checked
        CheckBox1.Enabled = Not String.IsNullOrEmpty(methodName)

        'Sub Dispose() の実装
        ListBox1.DataSource = EnumrateMethodImpl(selType, declaredOnly, methodName)

        'Sub Dispose(Boolean) の実装
        ListBox2.DataSource = EnumrateMethodImpl(selType, declaredOnly, methodName, GetType(Boolean))
      End Sub

      Public Shared Function EnumrateMethodImpl(ByVal t As Type, ByVal declaredOnly As Boolean, ByVal methodName As String, ByVal ParamArray params As Type()) As Type()
        Dim bf As BindingFlags = BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance
        If declaredOnly Then
          bf = bf Or BindingFlags.DeclaredOnly
        End If
        Dim targetType As Type = t
        Dim types As New List(Of Type)()
        Dim bt As Type = targetType
        Do
          If String.IsNullOrEmpty(methodName) Then
            types.Add(bt)
          ElseIf bt.GetMethod(methodName, bf, Type.DefaultBinder, params, Nothing) IsNot Nothing Then
            types.Add(bt)
          End If
          bt = bt.BaseType
        Loop Until bt Is Nothing
        Dim result As Type() = types.ToArray()
        Array.Reverse(result)
        Return result
      End Function
    End Class
記事No.91509 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91528  Re[5]: メモリリークに関して
□投稿者/ kiku -(2019/07/03(Wed) 17:43:52)
    No91525 (魔界の仮面弁士 さん) に返信
    > ■No91519 (WebSurfer さん) に返信
    >>Form コントロールの場合、Dispose(), Dispose(bool) の実装は Control toha違うようです。
    >>下のリンクをクリックして画像を見てください。
    >>http://surferonwww.info/BlogEngine/image.axd?picture=2019%2f7%2fFormDispose0.jpg
    > Dispose の実装は、Label と Form で差異が無さそうに見えます。
    > 少なくとも .NET Compact Framework においては。

    わざわざ検証いただきありがとうございます。

    > 手元の VS2008 環境で、Form1 の継承関係をたどってみました。
    > CE 機が無いので、エミュレーターでの動作ですけれども。

    貼って頂いたソースを実機で動かすことはできましたが
    その結果をどのように掲示板に報告するのが良いのか
    ソースの内容を理解できていないため、
    わかりませんでした。
    継承関係を同じように報告すべきだとは思うのですが、
    ごめんなさい。
記事No.91509 のレス /過去ログ158より / 関連記事表示
削除チェック/

■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より / 関連記事表示
削除チェック/

■91533  Re[7]: メモリリークに関して
□投稿者/ kiku -(2019/07/04(Thu) 09:08:37)
    No91530 (魔界の仮面弁士 さん) に返信
    > 一方 .NET Comapct Framwork の場合、ソースコードは提供されていませんが、
    > No91525 の実験結果から、Form.Dispose(bool) は特に存在しておらず、
    > 直接 Control.Dispose(bool) がそのまま呼ばれていることが確認できました。

    だとすると、
    子コントロールは明示的にDisposeしなくても良く、
    子コントロールが保持するFontなどのアンマネージリソースのみをDisposeすれば良いのでしょうか?

    > Nothing の代入有無で、本当に解放状況が変化するかどうかを確認してみました。
    > 端末を再起動して、空きメモリが十分に確保されている状態において、
    > Button1 でモードレス フォームを表示させた後、
    > Button2 でそれを Close させています。
    > すると、Close 直後の ★の行の Nothing 代入がコメントアウトされていた場合、
    > Form2 および LabelEx が直ちに Dispose されないケースが確認できました。
    > しかし Nothing 代入するようにした場合は、Button2 の時点ですぐに Dispose されるようになりました。
    > ただ、何度も実験を繰り返すと空きメモリが減ってくるようで、
    > その場合はどうやら GC が発動するらしく、Nothing 代入せずとも
    > Dispose される結果になるようです。

    そうすると、子コントロールは明示的にDisposeを行って、
    子コントロールにnull(今回C#なため)を設定し、
    子コントロールが保持するアンマネージリソースに対しても明示的にDisposeを行い、
    その参照もnullに設定するのが良さそうと理解しました。
記事No.91509 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91539  Re[10]: メモリリークに関して
□投稿者/ 魔界の仮面弁士 -(2019/07/04(Thu) 12:11:33)
    No91538 (kiku さん) に返信
    > AmbientとはフォームのFontを子コントロールが継承する機能であると理解しました。
    > よって、フォームのFontと子コントロールのFontは同じインスタンスである場合がある。

    アンビエントの具体例として:

    .NET Framework の場合、
    デザイン画面で Form に Label を貼って、
    その後で Form の Font を変更すると、
    Label の Font も連動して変更されます。

    このとき、デザイナのプロパティ グリッドを見てみると、
    Form の Font プロパティは変更されて太字表示されていますが、
    Label の Font は細字表示のままとなります。

    Label の Font を意図的に変更すれば、Label の Font プロパティも
    太字で表示されますが、この状態だと、Form の Font に連動しなくなります。


    ところが、.NET Compact Framework の場合、上記の動作が実装されていませんので、
    Compact Framework の実装がアンビエントになっている可能性は低いと予想しています。


    > この実験の結果をどのように理解していいか
    > 正直に言いますと良くわかりませんでした。

    .NET Comapct Framework の Font プロパティの getter は、
    アクセスするたびに、新しい Font インスタンスを
    生成する実装になっている可能性が高いことが伺えます。

    その根拠は、
     var f1 = textBox1.Font;
     var f2 = textBox1.Font;
    において、f1 と f2 が別のインスタンスとなったという点からです。
    (同じインスタンスを返す条件が存在する可能性を否定することは出来ませんが)


    また、No91525 のコードで「get_Font」メソッドの実装状況を調べたところ、
    Font プロパティは Control クラスで宣言されているのみで、
    継承先(Label や Form や ContainerControl 等)でオーバーライドされていないこともわかります。


    という事はすなわち、最初の No91509 にて記述されていた、

    >> this.lbl_serialnumber.Font.Dispose();//★対策追加

    というコードが無価値であるように思うのです。

    Font プロパティにアクセスするたびに新しい Font が生成され、
    それがすぐに破棄されるだけなのではないかと。
    (メモリ負荷等は見ていないので、アンマネージリソースの管理状況までは分かりませんが)


    では、そもそも破棄した Font を使おうとしたらどうなるのか?

    var f1 = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);
    var f2 = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);
    f2.Dispose();
    button1.Font = f1;
    button2.Font = f2;
    button1.Font.Dispose();



    てっきり ObjectDisposedException が発生するのかと思いきや、そうでは無いようです。

    .NET Compact Framework の場合は、button1 だけが新しいフォントになります。
    button2 の方は以前のフォントのままレンダリングされていました。

    一方 .NET Framework においては、button1 / button2 両方とも
    新しいフォントでレンダリングされました。エラーになることもなく。
記事No.91509 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -