0

C#/.NET/mono などをいじり始めたばかりで、シンプルなソング プレーヤーを作ろうとしています。このために、私は使用winmm.dllしています(簡単なクロスプラットフォームソリューションが見つかりませんでした)。問題はこれです: 曲の再生に合わせてトラックバーを更新する必要があります。ミリ秒単位で時間を返すPlayer.GetLengthとの2 つの関数があります。Player.GetCurrentPosition「普通」と呼べば大丈夫です。しかし、次のようにタイマーで呼び出す必要があります。

new System.Threading.Timer((state) =>
{
    length = Player.GetLength();
    pos = Player.GetCurrentPosition();
    trackBar1.Value = (pos / length) * 100;
}, null, 0, 100);     

これはGetLengthであり、GetCurrentPosition類似しています。

public static int GetLength()
{
    StringBuilder s = new StringBuilder(128);
    mciSendString("status Song length", s, s.Capacity, IntPtr.Zero);
    return int.Parse(s.ToString());
}

問題:これら 2 つの関数のいずれかが呼び出されると、プログラムは警告も例外もスローされずに停止します。注: .NET を使用しています

だから、どこが間違っていたのか説明してもらえないかと思っていました:)

4

1 に答える 1

2

私が注意したいことの1つは、 System.Threading.Timer が独自のスレッドでコールバックを起動することです。UI を操作しているため、System.Windows.Forms.Timer を (フォームのコンポーネントとして) 使用するか、次のように UI を呼び出す必要があります。

new System.Threading.Timer((state) =>
{
    length = Player.GetLength();
    pos = Player.GetCurrentPosition();
    trackBar1.Invoke(new Action(()=>trackBar1.Value = (pos / length) * 100));
}, null, 0, 100);   

同様に、Player クラスが複数のスレッドをサポート/許容するかどうかはわかりませんが、そうでない場合は、UI に対してコールバック全体を呼び出す必要がある可能性があります。

于 2011-02-06T19:26:21.850 に答える