2012-03-28 7 views
2

私のアプリケーションは、別のスレッドでバックグラウンドでやるべき仕事を持っているとGUIがバックグラウンドスレッドが初期化では、このリストにスレッディングは遅すぎる

を埋めるリストから結果を描きますGuiのこのボタンで作業を開始します。バックグラウンドスレッドが動作している間に結果を読み取るために別のbuttomをクリックしますが、GUIは結果に応答するのが非常に遅いです。

私の結果がGUIで速く表示されるようにするソリューションはありますか?

私のコード:

Thread startdrawingthread = new Thread(StartDrawing); 

public MainWindow() 
{ 
    InitializeComponent(); 
} 

private void bt_draw_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    if (ch_single.IsChecked == true || ch_entire.IsChecked == true) 
    { 
     currentMode = ""; 
     startdrawingthread.Start(); 
     //StartDrawing(); 
     real_area.DrawingArea.Children.Clear(); 
     real_area.DrawGrid(20); 
    } 
} 

private void bt_single_next_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    if (GlobalV.isfinished == false) 
    { 
     while (true) 
     { 
      if (GlobalV.Attatched_Elements.Count > 0) 
      { 
       try 
       { 
        real_area.DrawingArea.Children.Clear(); 
        real_area.DrawGrid(20); 
        real_area.DrawElement(GlobalV.Attatched_Elements[i]); 
        i++; 
       } 
       catch 
       { 
       } 
       break; 
      } 
     } 
    } 

}

答えて

1

問題は限りGlobalV.Attatched_Elements.Countがゼロであるとして、ある、あなたのイベントハンドラは、while (true)の無限ループを通過します。

StartDrawingのどこかにGlobalV.Attatched_Elements.Countが設定されていると思いますが、ゼロより大きくなるまでこれをビジー待機させることはできません。またlockスレッドセーフなアクセスのためのコレクションをINGのと多分

private void bt_single_next_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    if (GlobalV.Attached_Elements.Count > 0) 
    { 
     ... 
    } 
} 

:あなたは、おそらく全体if (GlobalV.isfinished == false)while (true)ブロックを削除し、単純に次のことを行う必要があり、特に何もしないこれは何の関係も存在しない場合

private void bt_single_next_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    lock (GlobalV.Attached_Elements) 
    { 
     if (GlobalV.Attached_Elements.Count > 0) 
     { 
      ... 
     } 
    } 
} 
6

あなたは非同期プログラミングでsin#1をコミットしました。

ループがあります。 GlobalV.Attatched_Elements.Countが変わるのを待つのではなく、あなたは絶え間なくノンストップで尋ねます。「今は非ゼロですか?今は非ゼロですか?非ゼロです。今は0ではないですか?」と、CPUができるほど速いです。

つまり、多くの実行時間を無駄にしています。

あなたがとしたいのは、とは、Countが変更されたときに通知するイベントに登録するだけです。次に、変更されたときに、ゼロでないかどうかをチェックし、必要な処理を実行します。

+1

[まだありますか?](http://tvtropes.org/pmwiki/pmwiki.php/Main/AreWeThereYet) –

+0

それをやりましょう! Aaaahhh ..... – Puppy