私のプロジェクトの見落としは、インタラクティブなチュートリアルを作成することです。サウンド クリップを再生していますが、サウンド クリップの特定の時間に特定のアクションを実行したい (例: ボタンをハイライトする)。解決策を思いつきましたが、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 を使用しています。