2012-11-01 144 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精確到毫秒 –

相關問題