2012-05-14 3 views
2

큐를 사용하여 코드의 여러 독립 블록간에 공유되는 직렬 포트에 대한 액세스를 동기화하려고합니다. 모든 블록은 필요한 경우 대기열에 추가되고 직렬 포트에서 정확히 하나의 원자 조작을 처리하는 콜백 기능을 제공합니다. 그러면 타이머가 주기적으로 간섭을 일으키지 않고 모든 보류중인 작업을 실행합니다.C++/CLI : 멤버 함수 포인터 큐

저는 비교적 C++/CLI 프로그래밍에 익숙하지 않기 때문에 시스템 :: Collections :: Queue을 작성하고 일부 문자열을 대기열에 추가했습니다. 하지만 내 인생에서 내 콜백 함수 (void Test())에 대한 포인터를 사용하여 동일한 작업을 수행하는 방법을 파악할 수 없습니다.

집중적으로 봤지만 가장 간단한 예조차도 제대로 작동하지 않았습니다. 이 모든 위임자, Boost, Marshal, gcnew 물건들이 나에게 지금 당황 스럽다.

Microsoft Visual C++ 2010 Express를 사용하고 있습니다. 도움을 받으실 수 있기를 바랍니다. 독일에서

감사합니다,

폴 .NET/CLR 세계에서

+0

저는 대개 대리자와 공상 콜백을 직접 사용하지 않고 상속을 통한 콜백을 권장합니다. 관리되는/관리되지 않는 레이어를 트래버스해야하는 경우 C++/CLI에서 래퍼를 작성하는 것이 그리 어렵지 않습니다. 중간 수준의 콜백 레이어로 작동하여 호출을 관리되는 환경에 전달합니다. 적어도 나는 펑터 (functor)와 같은 사람들에게 마샬링 (marshalling)하는 것에 대해 배우는 것보다 쉬울 것이라고 생각한다. – Ian

답변

1

System.Delegate 클래스는 함수 포인터의 아날로그입니다.

낮은 수준의 작업을 수행하고 콜백이 고급 관리 환경에서 작성되므로 마샬링의 필요성이 발생합니다. 당신이 System.Delegate 인스턴스의 큐가있는 경우

네이티브 콜백과 같은 관리 기능 포인터를 사용하려면 다음 바로 수행이 MSDN 문서

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getdelegateforfunctionpointer(v=vs.80).aspx

을 필요로하는 D.DynamicInvoke() 목록을 호출 적절한 논증.

+0

나는 당신이 나를 잘못 이해했다. 나는 _System :: IO :: Ports :: SerialPort_가 잘 작동하기 때문에 직렬 포트에 접근하는 데 아무런 문제가 없다. 내가하고 싶은 것은 실제로 대기열에 기능을 넣고 나중에 실행하는 것입니다. 대기열, 타이머 및 콜백 함수는 실제로 모두 동일한 클래스에 있습니다. 콜백 함수에는 제한이 없으며, 관리 할 수도 있고 그렇지 않을 수도 있습니다. (따라서, 예제 함수 이름은 _void Test() _, _System :: Void Test() _가 될 수도 있습니다.하지만 잠깐만, 관리 코드와 비 관리 코드의 차이점이 있습니까?) –

+0

이벤트가 있습니다. 당신은 대기열에 함수 호출을 "저장"하고 다른 이벤트에서는 대기열에서 함수 호출을 "팝"하여 실행하려고합니다. 귀하가 언급 한 직렬 포트는 관련이 없지만 관리되지 않는 함수 포인터를 .NET 대리인으로 변환하려면 몇 가지 작업이 필요합니다. –

+0

정확히; 나는 내 주장을 분명히해야한다고 생각한다. –