2011-07-25 14 views
0

私は完全にこの問題に困惑しています。私はSilverlightでC#(VB.NETは使用しないでください)を使用して作成しているアプリケーション用の「クリックトラック」を作成しています。私はページ上に、クリック間の時間間隔を表すスライダーを持っています。 ()GUIをロックせずにwavファイルを再生する間に時間間隔を追加してください

int i = 0; 

while(i < 1) 
{ 
    using (var stream = TitleContainer.OpenStream("click.wav")) 
    { 
     var effect = SoundEffect.FromStream(stream); 
     FrameworkDispatcher.Update(); 
     effect.Play(); 
    }  
    ClickInterval(clickSlider.Value); 
    i++;  
} 

ClickIntervalをクリック間の時間間隔のための方法を表しています。言っていることを、私はこのような何かを見て自分のコードをしたいと思います。私はこの間隔を作る方法がわからない。タイマーは単にGUIをロックするだけで、これはスレッドがあまりにも多くのスレッドを作成する可能性があるため、スレッド化する方法があるかどうかはわかりません(これは本当に問題になるとは思えません)。おそらく上記のコードを書き直すこともできます。この一人のアイデアは何ですか?どんな提案も大きな助けになるでしょう!

+0

ご協力いただきありがとうございます。私は問題を解決することができました: – Dylan

+0

プライベートvoid TestMetronome(オブジェクト送信者、RoutedEventArgs e) { System.Windows.Threading.DispatcherTimer myDispatcherTimer = new System.Windows.Threading.DispatcherTimer(); myDispatcherTimer.Interval = new TimeSpan(0、0、0、0、1000); // 1000ミリ秒(1秒) myDispatcherTimer.Tick + =新しいEventHandler(Each_Tick); myDispatcherTimer.Start(); } – Dylan

+0

公共ボイドEach_Tick(オブジェクトo、のEventArgs送信者)(VARストリーム= TitleContainer.OpenStream( "click.wav")){ VAR効果= SoundEffect.FromStream(ストリーム)を使用して {。 FrameworkDispatcher.Update(); effect.Play(); } } – Dylan

答えて

0

私のオリジナルのアイデアは動作しないだろうが、これは可能性があります:

int i = 0; 
string[] songs = new string[] { "click.wav" }; 
Timer timer = new Timer(){ Interval = clickSlider.Value * 1000 }; // 1000 = 1 second 
EventHandler handler = (s,e) => 
{ 
    timer.Stop(); 
    PlayNext(songs, i++); 
    if(i < songs.Length) 
     timer.Start(); 
}; 
timer.Tick += handler; 

handler(null,null); // starts timer and plays first song. 

...

void PlayNext(string[] songs, int index) 
{ 
    using (var stream = TitleContainer.OpenStream(songs[index])) 
    { 
     var effect = SoundEffect.FromStream(stream); 
     FrameworkDispatcher.Update(); 
     effect.Play(); 
    }  
} 
1

GUIと同じスレッド内の任意のSleepがそれをロックします。クリックを再生するには、別のスレッドまたはBackgroundWorkerを使用する必要があります。

あなたのスレッドは、上記のようなコードが含まれます:あなたが見ることができるようにあなたがスレッドを停止するまで

var stream = TitleContainer.OpenStream("click.wav") 
var effect = SoundEffect.FromStream(stream); 

while(true) 
{ 
    FrameworkDispatcher.Update(); 
    effect.Play();  
    ClickInterval(clickSlider.Value);  
} 

、これはバックグラウンドで継続的に実行されます。 (GUI上で「停止」ボタンがある場合は、whileループから抜け出す変数を設定することもできます)。streameffectを取り出して、スレッドの作成と破棄を続けます。

ClickIntervalは、渡される値がミリ秒単位の場合は、基本的にThread.Sleep(clickSlider.Value)を呼び出します。

+0

Thread.Sleepはウィンドウをロックします。これも私の最初のアイデアでした。そしてOPは具体的に言って、GUIをロックしないように言った。 –

+0

@Chuck:あなたがGUIスレッド以外のスレッド*以外の*でそれをするのではない。これはGUIスレッド上でこのような作業をしない理由です。 –

関連する問題