2016-03-26 10 views
-2

文字で表示されているテキストを処理しています。私は文字のアルファベット順の文字がループ中に表示されます

while (times == 1) 

の代わりに使用している場合

public partial class Form1 : Form 
{ 
    public static int index = 0; 
    public int times = 0; 
    public Form1() 
    { 
     times = 1; 
     InitializeComponent(); 
    } 
    public string texto = "Developed by HugoRod"; 
    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (times==1) 
     { 
      label1.Text = texto.Substring(0, index) + "_"; 
      index++; 
      if (index==texto.Length) 
      { 
       index = 0; 
       times = 2; 
      } 
     } 
    } 
} 

:ここ

がコードである

if (times == 1) 

をテキストはすぐに行く、誰かが私に理由を伝えることができますか? ありがとう、

+0

あなたのコードをインデントする方法を学んでください。あなたが記述する方法でwhileループが動作する理由は、いくらか明らかになります。 – cybermonkey

+2

@HugoRod - UIのディスパッチ捜索 - 'if'アプローチが動作する理由は、タイマーメソッドが毎回呼び出され、UIがリフレッシュされるということです。あなたが' while'ループで更新を行う場合、UIはありません – BrokenGlass

答えて

0

すべての文字を出力した後でのみ、times = 2を設定しています。したがって、コードをwhileループ内で実行すると、timesがもはや1にならなくなるまでループが繰り返し実行されます。これは、すべての文字が表示された後にのみ発生します。

+1

の間で更新されますが、このコードを 'while'ループで実行してもすべてのテキストが表示されている場合でも、 – BrokenGlass

+0

なぜdownvoteですか?答えは正しいもので、特定の質問に答えます。コードに追加のバグがあるだけで、私の答えには影響しません。 – RJM

+1

私はOPが理解していないと思うのは、whileループがUIスレッドをブロックするということです。したがって、テキストボックスは、メソッドが終了するまで(そして文字列全体が追加されるまで)再描画されません。 –

1

現在のコードでは、タイマーのティックごとに1文字を追加しています。

コントロールの内容を変更すると、ウィンドウの一部が再描画する必要があることを知らせるためにウィンドウの一部が無効になり、スクリーンのセクションがすぐに再描画されることはありません。ウィンドウは、タイマーコードが実行されている同じスレッドにメッセージを受け取り、メッセージポンプがそのメッセージに到達すると、無効とマークされた部分を再描画します。

重要な点は、画面の更新がタイマーコードと同じスレッドで実行されていることです。タイマーコードの実行中に画面が更新されません。このため、UIスレッドで実行される非常に長時間実行されるコードがある場合、UIは更新を停止し、長時間実行されるコードが終了してメッセージポンプがキ​​ューに入れられたメッセージを処理するまで何も反応しません。これをテストするには、Thread.Sleep(1000)を挿入してタイマーハンドラに1秒の遅延を与え、その間に画面が更新されないことを確認します。

それぞれの文字をテキストボックスに1つの「長い」(比較的)プロセスで順次配置するループをwhileに配置すると、フォームを再描画する必要があることを伝えるメッセージは処理されません追加。コードを終了すると、キューに入れられたメッセージが処理され、画面が1回再描画されます。その背後にあるメカニズムについては心配しないでください。複数の更新から複数の再ペイントを取得しないようにしてください。

追加の間に画面が更新されるだけでなく、ループ全体が非常に短い時間で終了します。 〜17msのリフレッシュレートを無視します。これは完了までにループよりもはるかに時間がかかる可能性があります。あなたの目は、ミリ秒単位で起こっていることを検出できません。

関連する問題