#include
<iostream>
ref class
TEST
{
public:
void TestMethod()
{
System::Console::WriteLine(“TEST::TestMethod()”);
}
};
int main()
{
TEST^ test = gcnew TEST();
TestDelegate^ testDelegate = gcnew TestDelegate(
test, &TEST::TestMethod );
return 0;
};
정적 멤버함수의 델리게이트
{
public:
static void TestMethod()
{
System::Console::WriteLine(“TEST::TestMethod()”);
}
};
int main()
{
TestDelegate^ testDelegate = gcnew TestDelegate( &TEST::TestMethod
);
testDelegate();
getchar();
return 0;
};
복수 개의 델리게이트
델리게이트는 하나가 아닌 여러 개를 설정할
있습니다.
#include
<iostream>
ref class
TESTA
{
public:
void TestMethod()
{
System::Console::WriteLine(“TESTA::TestMethod()”);
}
};
ref class
TESTB
{
public:
static void TestMethod()
{
System::Console::WriteLine(“TESTB::TestMethod()”);
}
};
ref class
TESTC
{
public:
void operator()()
{
System::Console::WriteLine(“TESTC::operator()”);
}
};
int main()
{
TestDelegate^ testDelegate;
TESTA testA;
TESTC testC;
testDelegate = gcnew TestDelegate( testA, &TESTA::TestMethod
);
testDelegate += gcnew TestDelegate(&TESTB::TestMethod
);
testDelegate += gcnew TestDelegate( testC, &TESTC::operator
);
testDelegate();
getchar();
return 0;
};
델리게이트의 비교와 삭제
using namespace System;
delegate void MyDele(int);
void func1(int i)
{
Console::WriteLine("func1");
}
void func2(int j)
{
Console::WriteLine("func2");
}
int main()
{
MyDele^ dele;
dele += gcnew MyDele(&func1);
dele += gcnew
MyDele(&func2);
MyDele^ dele2 = gcnew
MyDele(func1);
dele2 += gcnew
MyDele(&func2);
if ( dele == dele2 ) {
Console::WriteLine("TRUE");
} else {
Console::WriteLine("FALSE");
}
dele -= gcnew
MyDele(&func1);
dele(1);
return 0;
}
위의 예의 델리게이트들은 모두 void를 반환하고 파라미터가 없는 것인데 당연하듯이 반환 값이나 파라미터를 가질 수 있습니다.
델리게이트의 비동기 실행
델리게이트는 비동기 실행을 지원합니다. 비동기 실행은 처리를 요청한 후 종료를 기다리지 않은 호출한 곳으로 제어를 넘겨줍니다. 델리게이트 함수가 긴 시간을 필요로 하는 작업인 경우 비동기 실행을 이용하면 프로그램의 응답성을 높일 수 있습니다.
델리게이트의 비동기 실행은 스레드를 사용합니다. 이런 경우 비동기 실행을 할 때마다 스레드의 생성과 소멸에 부담을 느낄 수도 있지만 델리게이트는 닷넷의 기능을 잘 활용하여 스레드를 생성/삭제하지 않고 스레드 풀에 있는 스레드를 사용하므로 스레드 사용에 대한 부담이 작습니다.
비동기 실행을 할 때는 주의해야 할 점이 있습니다. 비동기 실행을 하는 경우 델리게이트에는 꼭 하나의 함수만 등록해야 합니다. 만약 2개 이상 등록하였다면 예외가 발생합니다.
비동기 실행은 BeginInvoke()를 사용하고, 만약 종료를 기다리고 싶다면 EndInvoke()를 사용합니다.
#include "stdafx.h"
#include <iostream>
using namespace System;
delegate void MyDele(void);
void myfunc(void)
{
System::Threading::Thread::Sleep(3000);
}
int main(array<System::String ^> ^args)
{
MyDele^ dele = gcnew MyDele(&myfunc);
Console::WriteLine(L"1");
IAsyncResult^ result = dele->BeginInvoke(nullptr,nullptr);
Console::WriteLine(L"2");
dele->EndInvoke(result);
Console::WriteLine(L"3");
getchar();
return 0;
}
참고
http://cppcli.shacknet.nu/cli:delegate
http://cppcli.shacknet.nu/cli:delegate%E3%81%9D%E3%81%AE2
'C++/CLI' 카테고리의 다른 글
[Step. 11] 열거형( enum ) (2) | 2010.08.27 |
---|---|
[Step. 10] 이벤트 ( event ) (0) | 2010.08.20 |
[Step. 08] 프로퍼티 ( property ) (8) | 2010.08.06 |
[Step. 07] 비관리 클래스에서 관리 클래스를 멤버로, 관리 클래스에서 비관리 클래스를 멤버로 (0) | 2010.07.30 |
[Step. 06-2] 관리코드의 문자열과 비관리코드의 문자열 변환 (3) | 2010.07.23 |