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 メソッドを呼び出せなくなります。

上記の機能はスレッドランチャーで、ある程度スレッドをランチしたいが、条件によってはランチを遅らせたい。for ループと _wait.WaitOne(); を使用します。

どのような通話が実行されますか? ボタンコントロール

引っかかるのは何線?_wait.WaitOne()

待機とは AutoResetEvent

なぜ最初のスレッドの昼食後ですか?開始スレッドのグループを制御し、それらにジョブを完了させ (「ビジネス ロジックの使用」)、その後、さらにスレッドを開始させたいと考えています。

4

1 に答える 1

1

AutoResetEvent.WaitOneUI スレッドで呼び出しています。WaitOneメッセージをポンピングしないため、UI がフリーズします。ここでの一般的なアドバイスは、UI スレッドが別のスレッドからのシグナルを待機している間、UI スレッドをブロックするメソッドの呼び出しを避けることです。これにより、UI スレッドが発生するすべてのイベント (ボタンのクリック、画面の更新など) をディスパッチできなくなります。さらに悪いことに、誤って使用すると、あなたのケースで起こっているデッドロックが発生する可能性があります. それがどのようになっているのか見ないと、何が問題なのかはっきりとAutoResetEventSet言えませんがWaitOne、UI スレッドでの呼び出しは間違いなく問題です。

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

于 2012-05-03T16:56:09.677 に答える