2012-11-01 155 views
1

我使用以下代码导入“winmm.dll”。导入DLL并在单声道下运行应用程序

MyUtils = public static class 
    private 
    protected 
    public 
    [DllImport("winmm.dll")] 
    class method timeBeginPeriod(period:Integer):Integer; external; 
    [DllImport("winmm.dll")] 
    class method timeEndPeriod(period:Integer):Integer; external; 
    end; 

访问方法如下。

MyUtils.timeBeginPeriod(1); //within winform load event 
MyUtils.timeEndPeriod(1); //within winform formclosing event 

在Windows 7下,它的工作效果非常好。在Linux系统的单声道下,它工作得很好,但有一个例外。一旦程序启动,它就会弹出一个消息框,其中包含导入的dll的名称和OK按钮,如下所示。当我点击确定按钮时,我的程序继续按预期运行,没有任何错误。

enter image description here

我已经通过我的程序梳理,看看我故意在任何地方显示的dll文件名,但我根本就看不到这样的事情。

编辑:多一点信息,我需要WINMM.DLL是我需要能够调整线程睡眠粒度或默认延迟降低到约1毫秒或接近它的工作的原因 - 不来播放电影或音乐文件。我能够调整的唯一方法是通过这些方法timeBeginPeriodtimeEndPeriod。这样我的程序就可以通过串口成功通话。我的计划是每隔几毫秒24/7/365天不停地来回讲话。沟通率达到90%以上是至关重要的。导入dll文件后,我的程序通信在windows和linux上完美无瑕,除非我在单声道下在Linux上获得令人讨厌的消息框。

我从来没有见过或听说过这样的问题。有人为什么?

谢谢,

回答

3

我认为对Mono的工作方式存在一些误解。 WinMM.dll是Windows的本地二进制文件。单声道不会自动允许您导入winmm.dll并在Linux环境中使用它。我猜你的程序没有运行,因为timeBeginPeriodtimeEndPeriod不会执行。

除非你有一些Linux的Windows多媒体模块的端口,这是不行的。单声道移植到System.Media.SoundPlayer有没有什么办法可以从中获得所需的一切?

Mono中的P/Invoke工作得很好,但您仍然需要为每个平台本机构建二进制文件。

有利益约Porting to linux - Alternative to winmm

的文章,你可能想看看LGPL LAME

更新

问题是的Thread.sleep是没有一个准确的等待,无论分辨率的创建确定性的行为。您无法使用Thread.sleep来同步接近1ms粒度的内容。 JVM和.NET平台的精度都可以接近1毫秒,但这并不能保证。如果系统忙,你可能无法及时切换到你的线程,这意味着它可能是3ms,或者10ms,甚至30ms更糟。

有两件事你应该搜索。Linux上的高分辨率定时器。以及如何创建实时系统。既然你几乎需要沟通毫秒,你需要研究实时系统,并找出如何创建一个确定性的时间系统。

大多数计时器只会让你接近30毫秒的分辨率。

如果您发现Linux上的高分辨率定时器,你仍然需要考虑上下文切换时间和时间的推移,以弥补失去的时间,或者甚至是亚毫秒的处理减慢。

我知道你都声称它在Windows上的伟大工程,但我试图解释说,这是不是真的工作,你的思维方式。它现在可以工作,但是有很多场景可以在该机器上播放,这会导致您的系统不以1ms的间隔处理数据,因此您需要稍后调试系统。

有些事情要支持我:How to make thread sleep less than a millisecond on Windows

+0

安德鲁Finnell,我知道你在说什么。但是,我的程序确实有效,这些方法似乎按预期工作。对于串行通信,我无法获得低于10ms的Thread.sleep粒度。一旦我能够完成上述任务,串行通信就完美无瑕,或者除了上述问题之外,在Windows和Linux上100%都是稳定的,在我无法获得任何良好沟通之前。我会研究你的建议。 – ThN

+0

我希望人们实际上会提供更多的信息,而不仅仅是继续提供这个答案,这个答案目前并没有真正帮助我。我需要将Thread.Sleep延迟尽可能地缩短到实际的时间延迟。有没有办法与System.Media.SoundPlayer或LAME做到这一点? – ThN

+0

@digitalanalog更新答案,能够解释为什么你没有得到有关使用的Thread.sleep精确到毫秒 –

相关问题