- PR -

ShowDialogでハングする。

投稿者投稿内容
COPECHAN
会議室デビュー日: 2006/06/21
投稿数: 12
投稿日時: 2006-06-22 08:47
じゃんぬねっと様

確かに仰るとおりです。
検証コードには、少々お時間を頂きたいです。

Win32のネイティブコードであれば、アセンブラで追いかけることも可能ですが、
C#は混合モード表示も無く、コードのほとんどの部分が隠蔽されネイティブとは勝手が違いすぎてよくわかりません。
検証する上で、確認しておかなければならない点等ございますでしょうか?


P.S.
TopMost は False です。
Activated イベントもハンドルしていません。

よろしくお願いいたします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-06-22 09:35
引用:

COPECHANさんの書き込み (2006-06-22 08:12) より:

逆にお聞きしたいのですが、何らかのコードを仕込むことによって、
「Loadイベントが発生しない(発生させない)」事が可能なのでしょうか?


Load イベントが発生しない事ということで考えると

イベントハンドラの定義が消えているとか
this.Load += new System.EventHandler(this.Form1_Load);
が InitializeComponent() にありますか?
COPECHAN
会議室デビュー日: 2006/06/21
投稿数: 12
投稿日時: 2006-06-22 09:50
引用:

かるあさんの書き込み (2006-06-22 09:35) より:

Load イベントが発生しない事ということで考えると

イベントハンドラの定義が消えているとか
this.Load += new System.EventHandler(this.Form1_Load);
が InitializeComponent() にありますか?




イベントハンドラの定義は問題なく存在しています。
デバッガで、確実に通過していることも確認済みです。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-06-22 12:53
「ハング」してると思われるタイミングで、デバッガで一時停止してみてはどうでしょうか?
引用:

C#は混合モード表示も無く、コードのほとんどの部分が隠蔽されネイティブとは勝手が違いすぎてよくわかりません。


処理を脱出していないのは多分 COPECHAN さん(もしくはチームの誰か)の書いたコードですよ。
_________________
囚人のジレンマな日々
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-06-22 13:13
引用:
Win32のネイティブコードであれば、アセンブラで追いかけることも可能ですが、
C#は混合モード表示も無く、コードのほとんどの部分が隠蔽されネイティブとは勝手が違いすぎてよくわかりません。

ブレークで止まってるときにコードエディタ上で右クリックして「混合モード表示」できますよ。

Framework内部が原因である可能性はきわめて低いですが。
COPECHAN
会議室デビュー日: 2006/06/21
投稿数: 12
投稿日時: 2006-06-22 13:18
一時停止してみました。(すみません、混合モードウィンドウあったんですね。)

デバッカの緑の▲は、下記の矢印の場所を示していました。
ds:[7BA76768h]の関数を呼んだところで止まっているように見えます。
また、呼び出し履歴の最上位は、[<非ユーザコード>]を示しています。

----
 000000de mov edx,dword ptr ds:[01CC1010h]
 000000e4 mov ecx,esi
 000000e6 cmp dword ptr [ecx],ecx
 000000e8 call dword ptr ds:[163253E8h]
if( DialogResult.OK == itemSearch.ShowDialog( this ) )
 000000ee mov dword ptr [ebp-24h],1
 000000f5 mov edx,edi
 000000f7 mov ecx,esi
 000000f9 cmp dword ptr [ecx],ecx
 000000fb call dword ptr ds:[7BA76768h]
→00000101 mov ebx,eax
 00000103 cmp dword ptr [ebp-24h],ebx
 00000106 jne 0000018C
----

よろしくお願いいたします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-06-22 15:31
引用:
デバッカの緑の▲は、下記の矢印の場所を示していました。

緑ってことは例外でてません?
ShowDialog(this); とか Show(this); じゃなくて
ShowDialog(); や Show(); でも「ハング」しますか?
(例えばthisがShowするForm自身だったら例外でるだろうし)

Show() ってVisibleをtrueにしているだけだと思うので、、
Visibleをオーバーライドしてるとか、、OnPaintとかをオーバーライドしてるとか・・・

引用:
影響のないと思われる部分を削除して再現性のある部分のコードを抜き出している段階です。

まあこれが先決でしょうかね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-06-22 22:02
引用:

COPECHANさんの書き込み(2006-06-21 17:38)より:

Formオブジェクトを生成し、
Formに定義してある描画オブジェクト(Label・TextBox)のTextに対して値を設定すると、
その後のShowDialog()およびShow()メソッドでハングする


確認がありませんが、では、
Text に対して値を設定しなければ、ハングしない
のでしょうか?
コード:
Form1 obj = new Form1(); 
// obj.Label.Text = "XXXXX"; //描画初期値設定 

obj.ShowDialog(this);


これが確認してあるなら、get アクセスメソッドも同じように、少しずつコメントアウトを外して、確認するべきだと思うのですが...


しかし、さんぷる、おかしくない?
コード:
private Label label1;

public Label Label
{
    get {
        { // ここで↓する必要があるの?
            // ここでODBC経由のDBアクセスがある。
            // ※ここは正常に通過していることは確認済み。
        } 
        GC.Collect(); // なぜいるの?
        return label1;
    }
    set{ // これ、まずくない?
        label1 = value;
    }
}


 label1 を、外部から書き換えるのは、良くないですね。Label は、Read Only で良いはずです。
理由は、kazukiさんのコード、特にコンストラクタを見てください。

 また、ここで GC.Collect をする意図も不明。
こんなもの、自分で呼び出すものではありません。
それとも、Dispose の代わりに使ってる?

 そもそも、本当にここで DB アクセスの必要があるの?
label1 を返すことと関係があるの?
または、label1 を書き換えている?

 そういえば、Label を返す必要があるの?
Label.Text へのアクセサがあれば足りるんじゃない?


 どう考えても、このアクセス メソッドで行っていることが疑わしい。
引用:

Formに定義してある描画オブジェクト(Label・TextBox)のTextに対して値を設定すると、
その後のShowDialog()およびShow()メソッドでハングするのですが、
これは(.NET Framework の)バグなのでしょうか、それとも仕様なのでしょうか?


この書き方だと、「自作のコードはない」といっているのに等しい。
それは、おかしい。

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