|
그때 그때 GetMem -> FreeMem 해두 되구요...
좀더 간단히 하려면, 데이터를 카피 해 오는 과정때 카피를 하는게 아니라 , WriteStream의 포인터만 가져 오고, 새 WriteStream 을 생성해서 원래 자리에 넣어두는겁니다.
그리고 그 Stream 을 전송에 쓰고, 전송 끝나면 해지 해 버리는거죠..
한단계 더 나가자면, 미리 Stream 2개 생성 해 두고 한번씩 교체하는 방법도 있습니다.
PS. 전 MemoryStream을 VCL 최고의 객체라고 생각 =_=ㅋ
용맨소녀 님이 쓰신 글 :
: 답변 감사합니다. 써주신 대로 해봤더니 효과가 있는 것 같아요..
:
: 근데, WriteStream에서 데이터를 몽땅 카피해온다고 하셨는데요..
:
: 그 뜻이 스트림을 임시 버퍼에 복사한 다음 그걸 WriteBuffer 한다는 말씀인가요?
:
: 임시버퍼의 사이즈가 꽤 커야할 것 같은데, 사용자 각각마다 있어야 하니까 메모리 사용량이 팍 증가할 것 같기도 하고요.. 아니면 WriteBuffer하기 전에 동적으로 생성했다가 WriteBuffer하고 나면 제거하는 식으로 하면 될까요?
:
:
: Lyn 님이 쓰신 글 :
: : 제가 썼던 방법은....(지금은 Indy를 안쓰지만.. 어쨋든 =_=;;;)
: :
: : 1. 커넥션마다 Send Thread를 하나 추가로 만듭니다. 그리고 Write용 Stream을 하나 생성합니다
: :
: : 2. Write할 때는 Stream에 Write 합니다.
: :
: : 3. SendThread는 Write Stream에 데이터가 있을 경우, WriteStream의 데이터를 몽땅 카피해서 가져 오고 WriteStream을 비웁니다. (물론 락 처리는 필수)
: :
: : 4. SendThread는 데이터 전송 합니다(아무리 느려도 언젠간 가것거니~ 하고)
: :
: : 5. 3으로 갑니다.
: :
: : Ps. Write시 Stream 사이즈가 일정이상 커지면 커넥션 끊어버립니다. 서버 죽으면 안된까
: :
: : 용맨소녀 님이 쓰신 글 :
: : : 클라이언트A 인터넷 속도를 4KB정도로 잡고.. 클라이언트B와 서버는 광랜 속도 그대로 설정했습니다..
: : :
: : : 서버에서 A,B순대로 200KB 짜리 패킷을 전송했습니다..
: : :
: : : 그러자 A에 WriteBuffer 할 때 수십초의 대기시간이 발생하더군요.. B의 경우는 순식간에 전송이 끝났고요..
: : :
: : : 암튼 문제의 A때문에 멀쩡한 B의 패킷 받는 시간이 엄청 느려진거지요..
: : :
: : : 극단적인 테스트 환경이긴 한데, 암튼 서버를 만들었는데, 이런 현상이 생기면 안될 것 같은데요..
: : :
: : : 그래서 각 유저별로 타이머 변수를 만들어서 WriteBuffer직전에 User->Timer = timeGetTime() 하고...
: : :
: : : TTimer를 하나 만들어서 안에다 timeGetTime() - User->Timer 한 값이 5초 정도를 초과하면 강제로 Disconnect()시켰는데, 이것도 금방 되지는 않고 지연되는 시간이 있더라고요..
: : :
: : : 뭐 좋은 방법이 없을까요?
|