1

私のプロジェクトの見落としは、インタラクティブなチュートリアルを作成することです。サウンド クリップを再生していますが、サウンド クリップの特定の時間に特定のアクションを実行したい (例: ボタンをハイライトする)。解決策を思いつきましたが、CPU を大量に消費しているように感じます。私が思いついた解決策は、サウンド クリップ中に発生する個々のアクションごとに個々のタイマーを設定することです。50 の異なるスレッドを作成している 50 の異なるアクションに対して 50 の異なるタイマーを作成し始めると、最終的に CPU でこのクランチダウンが発生することが予測されます。

これらのタイマーを使用した現在のコードのスニペットを次に示します。

private void Label_FindingPart_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        sound.Source = new Uri(@"C:\SomeSound.wav");
        sound.Position = TimeSpan.Zero;  
        sound.Play();

        Timer_Logistics_Button(1000);
        Timer_Logistics_Window(1500);
        Timer_MMBE_Button(2000);
        Timer_MMBE_Window(2500);
    }
    //Timer initalized
    private void Timer_Logistics_Button(int interval_length)
    {
        System.Timers.Timer aTimer = new System.Timers.Timer();
        aTimer.AutoReset = false;
        aTimer.Elapsed += new ElapsedEventHandler(On_Timer_Logistics_Button);
        aTimer.Interval = interval_length;
        aTimer.Enabled = true;
    }
    //Action when the Elapsed event is raised.
    private void On_Timer_Logistics_Button(object source, ElapsedEventArgs e)
    {
        Dispatcher.BeginInvoke((Action)delegate()
        {
            Button_Logistics.Visibility = Visibility.Visible;
        });

    }
    //Timer initalized
    private void Timer_Logistics_Window(int interval_length)
    {
        System.Timers.Timer aTimer = new System.Timers.Timer();
        aTimer.AutoReset = false;
        aTimer.Elapsed += new ElapsedEventHandler(On_Timer_Logistics_Window);
        aTimer.Interval = interval_length;
        aTimer.Enabled = true;
    }
    //Action when the Elapsed event is raised.
    private void On_Timer_Logistics_Window(object source, ElapsedEventArgs e)
    {
        Dispatcher.BeginInvoke((Action)delegate()
        {
            Image_SAP_Main.Visibility = Visibility.Hidden;
            Image_SAP_Main_Logistics.Visibility = Visibility.Visible;
            Button_Logistics.Visibility = Visibility.Hidden;

        });

    }
    //Timer initalized
    private void Timer_MMBE_Button(int interval_length)
    {
        System.Timers.Timer bTimer = new System.Timers.Timer();
        bTimer.AutoReset = false;
        bTimer.Elapsed += new ElapsedEventHandler(On_Timer_MMBE_Button);
        bTimer.Interval = interval_length;
        bTimer.Enabled = true;
    }
    //Action when the Elapsed event is raised.
    private void On_Timer_MMBE_Button(object source, ElapsedEventArgs e)
    {
        Dispatcher.BeginInvoke((Action)delegate()
        {
            Button_MMBE.Visibility = Visibility.Visible;
        });
    }
    //Timer initalized
    private void Timer_MMBE_Window(int interval_length)
    {
        System.Timers.Timer bTimer = new System.Timers.Timer();
        bTimer.AutoReset = false;
        bTimer.Elapsed += new ElapsedEventHandler(On_Timer_MMBE_Window);
        bTimer.Interval = interval_length;
        bTimer.Enabled = true;
    }
    //Action when the Elapsed event is raised.
    private void On_Timer_MMBE_Window(object source, ElapsedEventArgs e)
    {
        Dispatcher.BeginInvoke((Action)delegate()
        {
            Image_SAP_Main_Logistics.Visibility = Visibility.Hidden;
            Button_MMBE.Visibility = Visibility.Hidden;
            Image_SAP_MMBE.Visibility = Visibility.Visible;
        });
    }

私の他のアイデアは、1 つのスレッドを作成し、sound.play() と同時に開始することです。この 1 つのスレッドには、各アクション間の待機時間のために複数の thread.sleep() ステートメントがあります。したがって、振り返ってみると、次のようになります。

    Step A: Play();
    Step B: Thread.Start();
    Step C: Thread.sleep(1000);
    Step D: ACTION;
    Step E: Thread.sleep(500);
    Step F: ACTION;
    Step G: Thread.sleep(1200);
    Step H: ACTION;
    Step I: Thread.Stop();

以下のコードは、ステップ D からステップ E に進むのに苦労していたスレッドで取得できる限りのものです。スレッドを適切に停止する方法もまだ見つける必要があります。以下のコードは、私が悪化させることができたものです:

     System.Threading.Thread Tutorial_Thread = new System.Threading.Thread(new System.Threading.ThreadStart(
        delegate()
        {
            // Do the work here.
            Thread.Sleep(5000);


            this.Dispatcher.BeginInvoke(new Action(
            delegate()
            {
                // Invoke any updates to the GUI here.
                Button_Logistics.Visibility = Visibility.Visible;

            }
         ));
        }
         ));
        sound.Play();
        Tutorial_Thread.Start();

スレッドが終了すると、スレッドの先頭に戻り、その thread.sleep(5000) を実行します。スレッドを介して各回転のスリープ時間とアクションを変更する方法がわかりません。どんな助けでも大歓迎です。私は質問を明確で理解しやすいものにしたいと思っています. Visual Studio 2012、C#、WPF を使用しています。

4

3 に答える 3

0

スレッドはコードを実行してから終了します。コードがループしない限り、スレッドはループしません。投稿したサンプルでは、​​スレッドは 5 秒間待機し、ボタンの可視性を変更してから終了します。

つまり...一連のアクションが定義されているので、次のように記述できます。

Thread Tutorial_Thread = new Thread(() => 
    {
        Thread.Sleep(1000);
        this.Dispatcher.BeginInvoke(() => do_step_d());
        Thread.Sleep(500);
        this.Dispatcher.BeginInvoke(() => do_step_f());
        Thread.Sleep(1200);
        this.Dispatcher.BeginInvoke(() => do_step_h());
    });
Tutorial_Thread.Start();

スレッドはステートメントを処理し、Sleep呼び出しで一時停止し、さまざまなステップ メソッドを実行してから終了します。

もちろん、これは単純化した例です。単一のシーケンスのみを実行する静的なコードを記述し、異なるシーケンスごとに同様のコードを記述するよりも、イベント シーケンスをキューに入れることができるスケジューリング システムを見つけたほうがよいでしょう...おそらくmike z 'を使用してタイミングを処理するための提案。

于 2013-06-12T01:59:12.067 に答える
0

これを行う最も簡単な方法は次のとおりだと思いますasync

private async void Label_FindingPart_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    sound.Source = new Uri(@"C:\SomeSound.wav");
    sound.Position = TimeSpan.Zero;  
    sound.Play();

    await Task.Delay(1000);
    Button_Logistics.Visibility = Visibility.Visible;

    await Task.Delay(500);
    Image_SAP_Main.Visibility = Visibility.Hidden;
    Image_SAP_Main_Logistics.Visibility = Visibility.Visible;
    Button_Logistics.Visibility = Visibility.Hidden;

    await Task.Delay(500);
    Button_MMBE.Visibility = Visibility.Visible;

    await Task.Delay(500);
    Image_SAP_Main_Logistics.Visibility = Visibility.Hidden;
    Button_MMBE.Visibility = Visibility.Hidden;
    Image_SAP_MMBE.Visibility = Visibility.Visible;
}

停止する必要がある場合は、 a を使用して、それをすべての呼び出しにCancellationTokenSource渡します。CancellationTokenTask.Delay

于 2013-06-12T11:58:48.423 に答える