none
コントロールのプロパティーのマルチスレッド下で変更手法 RRS feed

  • 質問

  • お世話になります。
    コントロールのEnabledの変更をマルチスレッド下で行うために下記のようなメソッドを作成しています。
    このメソッドを使用するとごく稀にアプリケーションがダウンすることがあるようなのですがどこに問題があるかわかりません。
    ご意見を頂けると幸いです。

    環境
    WindowsXp Professional
    VB 2005
    .Net Framework 2.0
    ---------------------------------------------------------------------------------------------------------------
        Public Delegate Sub Ctl_Enabled(ByVal Frm_Ctl As Windows.Forms.Control, _
                                          ByVal pblnRec_Start As Boolean)

        Public SubCtl_Enabled AS Ctl_Enabled = AddressOf SetCtl_Enabled
        '''+==========================================================================================================
        ''' <summary>
        ''' ボタンを制御する
        ''' </summary>
        ''' <arguments>
        ''' pFrm_Ctl       Frmコントロール
        ''' pblnRec_Start  設定値
        ''' </arguments>
        '''+==========================================================================================================
        Public Sub SetCtl_Enabled( ByVal pFrm_Ctl          AS Windows.Forms.Control, _
                                    ByVal pblnRec_Start     AS Boolean )
            try
                If pFrm_Ctl.InvokeRequired Then
                    pFrm_Ctl.Invoke( SubCtl_Enabled, pFrm_Ctl, pblnRec_Start )
                Else
                    pFrm_Ctl.Enabled = pblnRec_Start
                End If
            Catch ex As Exception
            End Try
        End Sub
    --------------------------------------------------------------------------------------------------------
    使用側
    SetCtl_Enabled(Button1, True)

    2009年5月13日 3:02

回答

すべての返信

  • きちんとInvoke()を使ってますし、問題なさそうな気がしますが。
    「ダウンする」とは具体的にはどうなるのでしょう? 例外が発生するなら、その例外にヒントがありそうです。

    個人的にはInvokeRequiredプロパティを見るのは面倒なので、無条件にInvoke()を経由してしまえばと思います。
    • 回答としてマーク sk7474 2009年5月22日 9:39
    2009年5月13日 4:07
  • 「ダウンする」とは具体的にはどうなるのでしょう? 例外が発生するなら、その例外にヒントがありそうです。

    返信ありがとうございます。
    実際にはこのメソッドを入れたアプリケーションがいつの間にか落ちているとの報告を受けており、
    入れているログを調べるとこのメソッドが呼び出される直前で終わっていることが判明しました。
    間接的にしか情報収集でいないのですが例外メッセージなどは表示されず、アプリケーション画面からWindows画面が表示されるように
    なるようです。

    karashima様の返信を参考にし再度検討してみたのですが、Invoke時のパラメータには「NEW object」を付帯した方が良いのでしょうか。
    2009年5月13日 11:09
  • ご返信ありがとうございます。
    参考にさせていただきます。
    2009年5月13日 11:10
  • そのログはどこまで信頼性のあるものなのでしょうか? 他の原因で落ちている可能性はないですか?
    例外を表示するコードを書かなければ表示されることはないでしょう。

    >        Catch ex As Exception
    >        End Try

    コードがここに到達したりしていませんか? その際のexの値は確認していますか?

    ご自身でできる最低限の調査がなされていないような気がします。
    • 回答としてマーク sk7474 2009年5月22日 9:39
    2009年5月13日 11:18
  • ご返信ありがとうございます。

    ご指摘ごもっともです。

    再調査を行います。


    2009年5月14日 1:39
  • こんにちは。中川俊輔です。

    karashimaさん、佐祐理さん、回答ありがとうございます。

    yoshiさん、フォーラムのご利用ありがとうございます。
    有用な情報と思われたため、karashimaさん、佐祐理さんの回答へ回答マークをつけさせていただきました。

    再調査した結果で何かわからないことがありましたら、エラーの詳細等を記述して質問してみてください!

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年5月22日 9:45