태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

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 참고!



이방법을 구현하기위하 온갖 MSDN을 뒤지면서 나만의 방법으로 바꿔주는데 성공했다.

정말 힘들었던 작업....중 하나.. 정말 유용하게 쓰인다!

나같은 Robot Programming을 하는 사람이라면.. 디바이스제어는 C++
Main Program은 Error가 적은 C#을 사용하용하는 사람들이 꽤 있을거 같다..

댓글을 달아 주세요

  1. Favicon of https://blueasa.tistory.com BlogIcon blueasa 2012.05.03 17:05 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다. :)

  2. thx 2017.10.10 01:17  댓글주소  수정/삭제  댓글쓰기

    thx