2012-05-03 12 views
0
private delegate void Runner(); //A delegate, but this attempt didn't work 
public void Run() 
{ 
    Stager.InstructionsMemory = InstructionsTextBox.Text.Split('\n'); 
    Stager.InintializeLists(); 
    InstructionThread = new Thread[Stager.InstructionsMemory.Length]; 
    PipelineInitializor(); 
    BlockingCollection<Func<object>>[] tasks = new BlockingCollection<Func<object>>[Stager.InstructionsMemory.Length]; 
    PCounterLabelUpdate up = new PCounterLabelUpdate(PCounterLabelUpdater); 
    MemoryUpdater MemUp = new MemoryUpdater(UpdateMemoryLists); 
    ButtonControl del = new ButtonControl(ButtonController); 
    ExecuteBtn.Invoke(del, new bool[] { false, true }); 


    Cycle = 0; 

    for (APCounter = 0; APCounter < Stager.InstructionsMemory.Length; APCounter++) 
    { 

     int i1 = APCounter; 
     int i = APCounter; //Local Copy of Counter 
     tasks[i] = new BlockingCollection<Func<object>>(); 
     tasks[i].Add(() => Fetch(i1)); 
     tasks[i].Add(() => Decode(i1)); 
     tasks[i].Add(() => ALURes(i1)); 
     tasks[i].Add(() => Memory(i1)); 
     tasks[i].Add(() => WriteB(i1)); 
     InstructionThread[i] = new Thread(() => Worker(i1, tasks[i1])); 
     InstructionThread[i1].Start(); //Start a Thread 
     CycleLbl.Invoke(up); // Update GUI Control 
     this.Invoke(MemUp); // UPdate GUI 
     _wait.WaitOne(); //Wait 
    } 

    ExecuteBtn.Invoke(del, new bool[] { true, false }); 
} 

GUIが完全にフリーズして、setメソッドを呼び出すことができません。スレッドは完全にGUIをフリーズします

上記の機能はスレッドランチャーであり、一定量のスレッドをランチしたいが、条件に基づいてランチを遅らせたい。私はforループと_wait.WaitOne()を使用します。

何が実行されますか?ボタンコントロール

どのラインが詰まっていますか? _wait.WaitOne()

何が待っていますか? AutoResetEvent

最初のスレッドの昼食後にどうしてですか?私は、開始スレッドのグループを制御し、仕事を終わらせるようにしたい( "ビジネスロジックの使用")、次にもっとスレッドを昼食する。

+0

Run()とは何ですか?それが呼び出されると、どのラインが張り付いていますか?ラインが '_wait.WaitOne()'の場合、 '_wait'(おそらくブロッキングシンクロタイプ)とは何ですか?なぜ最初のスレッドが起動した後にループ内にあるのですか? –

+0

@MartinJamesもう一度チェックしてください – user1364852

答えて

1

UIスレッドでAutoResetEvent.WaitOneに電話しています。 WaitOneはメッセージをポンピングしないため、UIがフリーズします。一般的なアドバイスは、別のスレッドからの信号を待っている間にUIスレッドをブロックするあらゆる種類のメソッドを呼び出さないようにするためです。これにより、発生したすべてのイベント(ボタンのクリック、画面のリフレッシュなど)をUIスレッドがディスパッチできなくなります。さらに悪いことに、間違って使用されると、デッドロックが発生する可能性があります。 AutoResetEventSetであることを確認することなく、私は問題の内容を確認することはできませんが、WaitOneをUIスレッドで呼び出すことは間違いありません。

ちなみに、少し奇妙なUIスレッドのControl.Invokeも呼び出しています。これはあなたの質問で提示したものよりもはるかに多くのことがあると信じるか、またはInvokeがどのように使用されるべきかについての根本的な誤解を持っています。

関連する問題