typedef BOOL __stdcall Callback(int a, int b); //Hslee 콜백 등록! Callback *_cb; //C#의 콜백루틴 받아오는 포인터변수 void CallBackCall() //콜백 루틴시키는 함수...(Callback함수와 연결됨) { if(_cb != NULL) (_cb)(10,20); } void RegCallback(Callback *pcb) //C#의 콜백루틴 받아와 연결하는 함수 { _cb = pcb; }
using System.Runtime.InteropServices; namespace CallbackTest { class Program { [DllImport("CallbackTestDll.dll")] static extern void RegCallback1(Callback1 callback); delegate bool Callback1(int a, int b); static bool PrintWindow1(int a, int b) { Console.Write("a:"+a.ToString() + "b:" + b.ToString()+"\t"); return true; } static void Main(string[] args) { Callback1 callback1 = new Callback1(PrintWindow1); RegCallback1(callback1); } } }
C#의 delegate루틴을 C++에 넘겨준뒤. C++에서 콜백이 발생됬을경우 C#으로 넘기게된다.
여기서 주의할점.. C#은 콜백을 받아올때 가바지컬렉터 라는 놈이 관리를 하게된다..
Callback발생 -> 카비지컬렉터 -> C# 루틴
뭐 이런식으로 알고있다.. C#은 가비지컬렉터 수집을 자동으로 한다...
Callback이 사용자가 요청했을때만 들어온다면 상관없지만...
uRON(ETRI)의 로봇주행알고리즘 을 사용할경우 콜백이 미친듯이 들어와버리게된다..
그러면서 가비지컬렉터가 싸이면서.. 프로그램이 종료되게된다..
콜백이 미친듯이 들어오므로 가비지컬렉터수집을 사용자가 직접 해줘야 한다...
C#의 콜백 루틴 안에다가
GC.Collect();
를 넣어주게되면 가비지컬렉터를 강제로 수집하게된다..
자세한사항은 MSDN 참고!
Callback발생 -> 카비지컬렉터 -> C# 루틴
뭐 이런식으로 알고있다.. C#은 가비지컬렉터 수집을 자동으로 한다...
Callback이 사용자가 요청했을때만 들어온다면 상관없지만...
uRON(ETRI)의 로봇주행알고리즘 을 사용할경우 콜백이 미친듯이 들어와버리게된다..
그러면서 가비지컬렉터가 싸이면서.. 프로그램이 종료되게된다..
콜백이 미친듯이 들어오므로 가비지컬렉터수집을 사용자가 직접 해줘야 한다...
C#의 콜백 루틴 안에다가
GC.Collect();
를 넣어주게되면 가비지컬렉터를 강제로 수집하게된다..
자세한사항은 MSDN 참고!
이방법을 구현하기위하 온갖 MSDN을 뒤지면서 나만의 방법으로 바꿔주는데 성공했다.
정말 힘들었던 작업....중 하나.. 정말 유용하게 쓰인다!
나같은 Robot Programming을 하는 사람이라면.. 디바이스제어는 C++
Main Program은 Error가 적은 C#을 사용하용하는 사람들이 꽤 있을거 같다..
정말 힘들었던 작업....중 하나.. 정말 유용하게 쓰인다!
나같은 Robot Programming을 하는 사람이라면.. 디바이스제어는 C++
Main Program은 Error가 적은 C#을 사용하용하는 사람들이 꽤 있을거 같다..
'SoftWare > Visual C#' 카테고리의 다른 글
Emgu CV C#용 영상처리 라이브러리 (0) | 2009.03.16 |
---|---|
C# Class Library 만들기(이벤트 포함) (0) | 2009.03.08 |
C# Process Class (0) | 2009.03.06 |
C# 윈도우메세지 WM_USER MESSAGE 받기 (0) | 2009.03.06 |
C# 대리자 Invoke (0) | 2009.03.06 |
댓글