2012-11-01 2 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 파일의 이름을 표시하고 있는지 확인하기 위해 내 프로그램을 통해 빗질했지만, 난 그저 그런 아무것도 찾을 수 없습니다.

편집 : 조금 더 정보를, 나는 그것에 스레드 수면 단위 또는 약 1 밀리 초에 이르기까지 기본 지연 또는 가까운 조정할 수 있어야입니다 winmm.dll 작업해야하는 이유 - 하지 않음을 영화 또는 음악 파일을 재생할 수 있습니다. 내가 조정할 수있는 유일한 방법은이 방법을 통해 timeBeginPeriodtimeEndPeriod입니다. 그래서 내 프로그램은 시리얼 포트를 통해 성공적으로 대화 할 수있다. 내 프로그램은 24/7/365 일간 논스톱마다 몇 밀리 초씩 앞뒤로 이야기하는 것입니다. 커뮤니케이션이 90 % 이상인 것이 중요합니다. dll 파일을 가져온 후 Windows 프로그램과 Linux 프로그램에서 아무런 문제가 없습니다.

이전에는 그러한 문제에 대해 전혀 알지 못했습니다. 그 이유는 무엇입니까?

고마워,

답변

3

모노가 작동하는 방식에 대한 오해가 있다고 생각합니다. WinMM.dll은 Windows 용 기본 이진 파일입니다. Mono는 자동으로 winmm.dll을 가져 와서 Linux 환경에서 사용하도록 허용하지 않습니다. timeBeginPeriodtimeEndPeriod은 실행되지 않으므로 프로그램이 실행되지 않는 것으로 추측됩니다.

Linux 용 Windows Multimedia Module의 일부 포트가 없으면이 기능이 작동하지 않습니다. Mono는 System.Media.SoundPlayer을 통해 이식되어서 필요한 모든 것을 얻을 수있는 방법이 있습니까?

모노에서 P/Invoke는 매우 잘 작동하지만 각 플랫폼에 대해 기본적으로 빌드 된 바이너리가 필요합니다.

당신은 LGPL LAME보고 할 수 있습니다 Porting to linux - Alternative to winmm

에 대한 관심의 기사가있다.

업데이트

문제는 Thread.sleep를가 해상도에 관계없이 결정 동작을 만들 수있는 정확한 대기가되지 않는 것입니다. Thread.sleep을 사용하여 1ms 단위로 항목을 동기화 할 수 없습니다. JVM과 .NET 플랫폼 모두 1ms의 정밀도에 가깝지만, 이것이 보장되는 것은 아닙니다. 시스템이 바쁠 경우 스레드로 컨텍스트 전환을 다시 얻을 수 없을 수도 있습니다. 즉, 3ms 또는 10ms 또는 심지어 30ms가 될 수도 있습니다.

검색해야 할 두 가지 사항이 있습니다.Linux에서 고해상도 타이머. 그리고 실시간 시스템을 만드는 방법. 거의 ms로 의사 소통해야하므로 실시간 시스템을 연구하고 타이밍을위한 결정 성있는 시스템을 만드는 방법을 찾아야합니다.

대부분의 타이머는 사용자를 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

나는 사람들이 실제로이 순간에 나에게 도움이되지 않는이 대답을 upvoting하는 것보다 더 많은 정보를 실제로 제공하기를 바란다. 나는 Thread.Sleep 지연을 줄이기 위해 가능한 한 실제 시간 지연에 가깝게해야합니다. System.Media.SoundPlayer 또는 LAME을 사용하여이를 수행 할 수 있습니까? – ThN

+0

@ digitalanalog Millisecond 정밀도로 Thread.sleep을 사용하는 것에 대한 답을 얻지 못하는 이유에 대한 답변이 업데이트되었습니다. –