Q&A

  • INDY화상채팅소스에서 다음내용은 왜 이렇게 처리한거죠?
자료실에 있는 비디오채팅소스중에서 이부분은 왜이렇게 하신건가요?



procedure TfmServer01.ServerSockExecute(AThread: TIdPeerThread);

var

DataBuf : TDataBuf;

S : pDataBuf;

begin

try

while AThread.Connection.Connected do

begin

S := @DataBuf;

AThread.Connection.ReadBuffer(S^,BUFFER_LEN);

EnterCriticalSection(CritSect); <<----이부분요.

pRecBuf := S;

RecThread := AThread; <<----이부분요.

AThread.Synchronize(RecProc); // Receive Data Processing Syncronize...

<<---- 이부분

LeaveCriticalSection(CritSect);

end; // end of While loop...

finally

if not AThread.Terminated then

AThread.Terminate;

end;

end;



그리고 S : pDataBuf 라고 선언을 했는데 인디소켓에서 버퍼로 받은 내용을 S라는 변수에 저장을 하고 난다음 바로 다른 클라이언트가 접속을 하게 된다면 S버퍼의 내용은 변하지 않나요?

그리고 하나 더. 인디소켓에서 쓰레딩이 처리되어 시작되는 부분은 어디인가요?

EXECUTE부분에서 시작되는데 EXECUTE자체가 쓰레딩처리로 인하여 시작된곳인가요?

아님 그 아리에서 ATHREAD를 통해서시작된건가요?

1  COMMENTS
  • Profile
    이경문 2000.12.07 03:19
    Indy ServerSocket의 Execute 이벤트로 들어 올때 이미 메인 쓰레드가 아닌 다른 쓰레드 상태로 실행됩니다(Indy에서 알아서 쓰레드를 생성시키고 Resume시키면서 Execute 이벤트가 발생함).



    쓰레드에서는 TLS(Thread Local Storage)라는 것이 있는 쓰레드 하나당 생기게 되는 리소스를 말합니다.

    즉 클라이언트의 접속이 3개이면 TLS가 3개 생기게 되는 것이고 DataBuf, S 라는 지역변수가 다른 메모리를 할당받게 되고 3개의 DataBuf, S가 생기게 되는 거지요.



    델파잉에서 VCL관련 모듈을 제어할 때는 반드시 Synchronize를 해 주어야 합니다.Ctrl+Alt+T 을 눌러서 쓰레드창을 띄워 보시고 현재 어느 쓰레드를 실행하고 있는지 디버깅해 보면 Synchronize를 했을 때 실행 쓰레드가 변경되는 것을 볼 수 있습니다.



    Synchronize를 사용해 특정 함수를 실행시킬때는 파라미터를 넘겨줄 수 없습니다.

    그래서 인자기능을 하는 변수를 전역변수에 넣어 주고 그 함수를 Synchronize하기 위해 pRecBuf를 사용하는 것이지요.



    Critical Section을 동시에 여러개의 쓰레드(클라이언트)에서 같은 지원을 억세스하는 것을 방지하기 위해 사용되는 것입니다.

    즉 DB에서 Transaction과 개념이 비슷하다고 보시면 될 겁니다.

    예제에 있는 CS를 사용하는 것은 API 레벨이며 델파이에서 TCriticalSection이라는 클래스를 제공하므로 그것을 사용하시는 것이 더욱 편리할 것입니다.



    그런데 이 예제 누가 만든 것가요? 김하늘님인가?



    성병규 wrote:

    > 자료실에 있는 비디오채팅소스중에서 이부분은 왜이렇게 하신건가요?

    >

    > procedure TfmServer01.ServerSockExecute(AThread: TIdPeerThread);

    > var

    > DataBuf : TDataBuf;

    > S : pDataBuf;

    > begin

    > try

    > while AThread.Connection.Connected do

    > begin

    > S := @DataBuf;

    > AThread.Connection.ReadBuffer(S^,BUFFER_LEN);

    > EnterCriticalSection(CritSect); <<----이부분요.

    > pRecBuf := S;

    > RecThread := AThread; <<----이부분요.

    > AThread.Synchronize(RecProc); // Receive Data Processing Syncronize...

    > <<---- 이부분

    > LeaveCriticalSection(CritSect);

    > end; // end of While loop...

    > finally

    > if not AThread.Terminated then

    > AThread.Terminate;

    > end;

    > end;

    >

    > 그리고 S : pDataBuf 라고 선언을 했는데 인디소켓에서 버퍼로 받은 내용을 S라는 변수에 저장을 하고 난다음 바로 다른 클라이언트가 접속을 하게 된다면 S버퍼의 내용은 변하지 않나요?

    > 그리고 하나 더. 인디소켓에서 쓰레딩이 처리되어 시작되는 부분은 어디인가요?

    > EXECUTE부분에서 시작되는데 EXECUTE자체가 쓰레딩처리로 인하여 시작된곳인가요?

    > 아님 그 아리에서 ATHREAD를 통해서시작된건가요?