デバックについて への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 るしぇ  ()
投稿日時
2008/8/29 21:44:00
>>3
というか、処理は全て正常に実行されてるんだけど、描画処理が実行されないから
画面に反映されないだけね。
ウィンドウは常に再描画されています。他のウィンドウと重なった後とか、
最大化された時とか、ウィンドウをマウスで移動させた時とか。
自分のプログラムだけの問題ではないので、OS(Windows)が制御しています。
つまり、再描画処理は別のプログラムの仕事なんです。
基本的に、プログラムの実行中は一連の処理をまとめて実行します。この間に別の
プログラムの処理が命令された場合、待機状態となります。先に実行されている
処理が終わってから待機状態の命令が実行されます。
# このため、CPU使用率100%とかだとアプリケーションがなかなか起動しなかったり、
# 表示が遅れたり、いわゆる『重い』状態になります。
ボタンを押したイベントから、Button1_Click_1 の関数の処理は一括して
実行されます。この間、OSの再描画処理は実行されません。待機状態です。
Button1_Click_1 から End Sub までが実行されてから画面が再描画されます。
結果、最後の状態しか反映されません。
1つの解決方法として DoEvents で OS に制御を返す方法があります。ただし
これを実行してしまうと、再描画処理だけでなく、OS が溜め込んでいた待機
状態の命令が他にも実行されてしまうため、この場面では使用すべきでは
ありません。
プログラムから再描画処理を呼び出しましょう。
[Control.Refresh メソッド]
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.refresh.aspx
ほとんどのコントロールで使用できますので、そのコントロールの設定を変更した
直後に、必要な部分の再描画をしてみてください。
RichTextBox1.Refresh()
TextBox1.Refresh()
Me.Refresh()
など。
というか、処理は全て正常に実行されてるんだけど、描画処理が実行されないから
画面に反映されないだけね。
ウィンドウは常に再描画されています。他のウィンドウと重なった後とか、
最大化された時とか、ウィンドウをマウスで移動させた時とか。
自分のプログラムだけの問題ではないので、OS(Windows)が制御しています。
つまり、再描画処理は別のプログラムの仕事なんです。
基本的に、プログラムの実行中は一連の処理をまとめて実行します。この間に別の
プログラムの処理が命令された場合、待機状態となります。先に実行されている
処理が終わってから待機状態の命令が実行されます。
# このため、CPU使用率100%とかだとアプリケーションがなかなか起動しなかったり、
# 表示が遅れたり、いわゆる『重い』状態になります。
ボタンを押したイベントから、Button1_Click_1 の関数の処理は一括して
実行されます。この間、OSの再描画処理は実行されません。待機状態です。
Button1_Click_1 から End Sub までが実行されてから画面が再描画されます。
結果、最後の状態しか反映されません。
1つの解決方法として DoEvents で OS に制御を返す方法があります。ただし
これを実行してしまうと、再描画処理だけでなく、OS が溜め込んでいた待機
状態の命令が他にも実行されてしまうため、この場面では使用すべきでは
ありません。
プログラムから再描画処理を呼び出しましょう。
[Control.Refresh メソッド]
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.refresh.aspx
ほとんどのコントロールで使用できますので、そのコントロールの設定を変更した
直後に、必要な部分の再描画をしてみてください。
RichTextBox1.Refresh()
TextBox1.Refresh()
Me.Refresh()
など。
投稿者 つよし  ()
投稿日時
2008/8/29 19:31:00
>>2
申し訳ありません。
止まっていたのではなく、
最後のReader3の処理のみでした。
readerとreader2はブレイクポイントで見てみましたが、処理は通っているのですが、richtext1の背景が変化しません。
因みにブレイクポイントで見てみるとrichtext1.backcolorは通っていました。
1回だけ色が変化するのですが、
i = 10になった最後のループで
reader3のrichtext1.backcolorのみ
処理されていると思います。
申し訳ありません。
止まっていたのではなく、
最後のReader3の処理のみでした。
readerとreader2はブレイクポイントで見てみましたが、処理は通っているのですが、richtext1の背景が変化しません。
因みにブレイクポイントで見てみるとrichtext1.backcolorは通っていました。
1回だけ色が変化するのですが、
i = 10になった最後のループで
reader3のrichtext1.backcolorのみ
処理されていると思います。
投稿者 るしぇ  ()
投稿日時
2008/8/29 04:36:00
>>1
特に止まりはしませんね。
Sleep 入れても
画面に表示されるのは sw003.log
の内容だけでしょうが。
止まっているというのはどうやって
確認しましたか?
特に止まりはしませんね。
Sleep 入れても
画面に表示されるのは sw003.log
の内容だけでしょうが。
止まっているというのはどうやって
確認しましたか?
投稿者 つよし  ()
投稿日時
2008/8/28 23:57:00
上記のコードですが
2個目と3個目のReader.closeを
Reader2.close
Reader3.close
に直しました。
しかしやはり同じところで止まってしまいます。
よろしくお願いします。
2個目と3個目のReader.closeを
Reader2.close
Reader3.close
に直しました。
しかしやはり同じところで止まってしまいます。
よろしくお願いします。
投稿者 つよし  ()
投稿日時
2008/8/28 23:27:00
デバックを実行して結果を見ると
プログラムの途中までしか動きません。
エラーも警告も出ていません。
詳しい方教えて下さい。
コード
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
'While i < 10
'MsgBox("123")
Dim Reader As New IO.StreamReader("C:\sw001.log")
TextBox1.Text = Reader.ReadLine()
RichTextBox1.Text = Reader.ReadLine()
Reader.Close()
Select Case RichTextBox1.Text
Case "red"
RichTextBox1.BackColor = Color.Red
Case "blue"
RichTextBox1.BackColor = Color.Blue
Case "yellow"
RichTextBox1.BackColor = Color.Yellow
End Select
'ここまでで止まってしまいます。
Dim Reader2 As New IO.StreamReader("C:\sw002.log")
TextBox1.Text = Reader2.ReadLine()
RichTextBox1.Text = Reader2.ReadLine()
Reader.Close()
Select Case RichTextBox1.Text
Case "red"
RichTextBox1.BackColor = Color.Red
Case "blue"
RichTextBox1.BackColor = Color.Blue
Case "yellow"
RichTextBox1.BackColor = Color.Yellow
End Select
'System.Threading.Thread.Sleep(1000)
'MsgBox("123")
Dim Reader3 As New IO.StreamReader("C:\sw003.log")
TextBox1.Text = Reader3.ReadLine()
RichTextBox1.Text = Reader3.ReadLine()
Reader.Close()
Select Case RichTextBox1.Text
Case "red"
RichTextBox1.BackColor = Color.Red
Case "blue"
RichTextBox1.BackColor = Color.Blue
Case "yellow"
RichTextBox1.BackColor = Color.Yellow
End Select
i = i + 1
'System.Threading.Thread.Sleep(1000)
'End While
End Sub
プログラムの途中までしか動きません。
エラーも警告も出ていません。
詳しい方教えて下さい。
コード
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
'While i < 10
'MsgBox("123")
Dim Reader As New IO.StreamReader("C:\sw001.log")
TextBox1.Text = Reader.ReadLine()
RichTextBox1.Text = Reader.ReadLine()
Reader.Close()
Select Case RichTextBox1.Text
Case "red"
RichTextBox1.BackColor = Color.Red
Case "blue"
RichTextBox1.BackColor = Color.Blue
Case "yellow"
RichTextBox1.BackColor = Color.Yellow
End Select
'ここまでで止まってしまいます。
Dim Reader2 As New IO.StreamReader("C:\sw002.log")
TextBox1.Text = Reader2.ReadLine()
RichTextBox1.Text = Reader2.ReadLine()
Reader.Close()
Select Case RichTextBox1.Text
Case "red"
RichTextBox1.BackColor = Color.Red
Case "blue"
RichTextBox1.BackColor = Color.Blue
Case "yellow"
RichTextBox1.BackColor = Color.Yellow
End Select
'System.Threading.Thread.Sleep(1000)
'MsgBox("123")
Dim Reader3 As New IO.StreamReader("C:\sw003.log")
TextBox1.Text = Reader3.ReadLine()
RichTextBox1.Text = Reader3.ReadLine()
Reader.Close()
Select Case RichTextBox1.Text
Case "red"
RichTextBox1.BackColor = Color.Red
Case "blue"
RichTextBox1.BackColor = Color.Blue
Case "yellow"
RichTextBox1.BackColor = Color.Yellow
End Select
i = i + 1
'System.Threading.Thread.Sleep(1000)
'End While
End Sub
ありがとうございました。
早速やってみます。