0

我刚开始玩弄 C#/.NET/mono 之类的东西,我正在尝试制作一个简单的歌曲播放器。为此,我正在使用winmm.dll(没有找到简单的跨平台解决方案)。问题是这样的:我需要在播放歌曲的同时更新轨迹栏。我有两个函数,Player.GetLengthand 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());
}

问题:当这两个函数之一被调用时,程序只是停止,没有任何警告或异常抛出。注意:我使用的是 .NET

所以我想知道你是否可以向我解释我哪里弄错了:)

4

1 回答 1

2

我要注意的一件事是 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 回答