14.이벤트 또는 수신 처리 수행(콜백)을 제어하기

ProudNet에서는 이벤트 또는 수신 처리 수행(콜백 callback)을 제어하는 기능을 제공합니다.

14.1클라이언트에서 콜백을 중간에 끊기

CNetClient.FrameMove 를 호출하면 누적되어 있던 모든 이벤트와 수신 RMI가 일제히 호출됩니다. (9. 클라이언트 메인 루프의 이해 참조) ProudNet은 사용자가 원하는 경우 누적되어 있던 이벤트와 수신 RMI를 1회의 CNetClient.FrameMove 호출 구간 내에서 모두 처리하다 말고 중간에 리턴하는 기능이 있습니다. 그리고 남아있는 누적 이벤트와 수신 RMI를 다음 CNetClient.FrameMove 호출에서 마저 처리할 수 있도록 해줍니다.

남아있는 누적 이벤트와 수신 RMI를 중도에 끊으려면 RMI 수신 처리중인 루틴 또는 이벤트 수신처리중인 루틴에서 Proud.INetClientEvent.HolsterMoreCallbackUntilNextFrameMove 이나 Proud.IRmiStub.HolsterMoreCallbackUntilNextFrameMove 를 호출하면 됩니다.

DEFRMI_TestS2C_Foo(CMyClient)
{
    ...
    /* 이것을 호출하면 CNetClient.FrameMove는 남아있는
    누적 이벤트와 RMI 수신을 무시하고 즉시 리턴합니다. */
    HolsterMoreCallbackUntilNextFrameMove();
}

void CMyClient::OnClientLeave(...)
{
    ...
        /* 이것을 호출하면 CNetClient.FrameMove는 남아있는
        누적 이벤트와 RMI 수신을 무시하고 즉시 리턴합니다. */
        HolsterMoreCallbackUntilNextFrameMove();
}

14.2클라이언트에서 콜백을 보류하기

Proud.CNetClient.FrameMove에 의해 각종 이벤트와 RMI 수신을 콜백받을 때 추후에 다시 원하는 콜백이 일어날 수 있도록 하는 기능이 있습니다. 이를 콜백 보류하기라고 부릅니다.

콜백을 보류할 경우 보류된 콜백은 누적되어있는 수신 큐의 맨 뒤로 가게 됩니다. 그리고 해당 콜백은 다음 CNetClient.FrameMove 를 호출할 때 다시 일어납니다.

예를 들어, Callback B를 보류할 경우 아래와 같이 콜백이 실행됩니다.

FrameMove => Callback A => Callback B (보류!) => 리턴

FrameMove => Callback B(보류되었던 것의 재생) => ... => 리턴

본 콜백 기능을 정확히 이해하지 못하고 오용할 경우 수신된 RMI나 이벤트가 정확한 순서로 도착하지 않거나 무한 콜백이 발생하는 것으로 오해할 수 있습니다. 따라서 사용상의 주의를 요합니다.

콜백을 보류하려면 RMI 수신 처리중인 루틴 또는 이벤트 수신처리중인 루틴에서 Proud.INetClientEvent.PostponeThisCallback이나 Proud.IRmiStub.PostponeThisCallback를 호출하면 됩니다.

DEFRMI_TestS2C_Foo(CMyClient)
{
    ...
    /* 이것을 호출하면 CNetClient.FrameMove는 남아있는
    누적 이벤트와 RMI 수신을 무시하고 즉시 리턴합니다. */
    PostponeThisCallback();
}

void CMyClient::OnClientLeave(...)
{
    ...
    /* 이것을 호출하면 CNetClient.FrameMove는 남아있는
    누적 이벤트와 RMI 수신을 무시하고 즉시 리턴합니다. */
    PostponeThisCallback();
}