C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[479] TZQueueStream 입니다 ^.^ 역시 빌더의 힘은 대단하죠?
황경록 [mpbox] 6711 읽음    2005-07-11 09:29
네트워크 스트림 모델에 사용하려구 뚝딱뚝딱 만들었는데 아직 실제 사용하지는 않았구요 ^^
개념만 가지고 만들었는데 우선 기본적인 테스트로는 성공적으로 동작하니 안심(?)하셔도 될
것 같습니다.

스트림을 FIFO 방식으로 변경한 것입니다. ^^...

음... 여러모로 쓸모있는 클래스가 아닐까 생각됩니다만 헤헤 ^^... 그럼

즐빌하세요!

---- 헤더 입니다 -----

#ifndef unitZQueueStreamH
#define unitZQueueStreamH

#include <Classes.hpp>

#include "unitZSynchronize.h"

class TZQueueStream : public TZSynchronize
{
public:
    TZQueueStream();
    virtual ~TZQueueStream();

private:
    TMemoryStream* FStream;

public:
    int write(LPVOID pData, int iLen);
    int read(LPVOID pData, int iLen);
    int getbufSize();   
};

#endif

----- 소스 입니다. -----


#include <SysUtils.hpp>

#include "unitZCommon.h"
#include "unitZGConout.h"

#pragma hdrstop

////

#include "unitZQueueStream.h"

#pragma package(smart_init)

    /////////////////////////////////////////////////////////////////////
    /* TODO 1 -onicekr -cImplementation : TZQueueStream Implementation */
    /////////////////////////////////////////////////////////////////////

TZQueueStream::TZQueueStream()
    : TZSynchronize()
{
    FStream = new TMemoryStream();
    FStream->SetSize(0);   
}

TZQueueStream::~TZQueueStream()
{
    SAFE_DELETE(FStream);
}

int TZQueueStream::write(LPVOID pData, int iLen)
{
    try
    {
        this->TZSynchronize::Lock();

        try
        {
            int iWriting = FStream->Write(pData, iLen);

            #ifdef APP_NETWORK
            AnsiString szTmp;
            szTmp.sprintf("writing %d bytes, current buffer size %d bytes", iWriting, FStream->Size);
            zout.trace("%s%s\n", APP_INFO, szTmp);
            #endif

            return iWriting;
        }
        __finally
        {
            this->TZSynchronize::Unlock();
        }
    }
    catch( Exception &e )
    {
        #ifdef APP_EXCEPTION
        if( e.Message.Length() )
            zout.trace("%s%s\n", APP_EXCEPTION, e.Message);
        else
            zout.trace("%s%s\n", APP_EXCEPTION, DESC_UNKNOWN_EXCEPTION);
        #endif

        return -1;
    }

    return 0; //fake
}

int TZQueueStream::read(LPVOID pData, int iLen)
{
    try
    {
        this->TZSynchronize::Lock();

        try
        {
            FStream->Seek(0, soFromBeginning);

            if( iLen > FStream->Size )
                iLen = FStream->Size;

            int iReading = FStream->Read(pData, iLen);
            int iRemaining = FStream->Size - iReading;

            memmove(FStream->Memory, &((LPBYTE)FStream->Memory)[iReading], iRemaining);
            FStream->SetSize(iRemaining);

            #ifdef APP_NETWORK
            AnsiString szTmp;
            szTmp.sprintf("reading %d bytes, remaining buffer size %d bytes", iReading, FStream->Size);
            zout.trace("%s%s\n", APP_NETWORK, szTmp);
            #endif

            return iReading;
        }
        __finally
        {
            this->TZSynchronize::Unlock();
        }
    }
    catch( Exception &e )
    {
        #ifdef APP_EXCEPTION
        if( e.Message.Length() )
            zout.trace("%s%s\n", APP_EXCEPTION, e.Message);
        else
            zout.trace("%s%s\n", APP_EXCEPTION, DESC_UNKNOWN_EXCEPTION);
        #endif

        return -1;
    }

    return 0; //fake
}

int TZQueueStream::getbufSize()
{
    return FStream->Size;
}

+ -

관련 글 리스트
479 TZQueueStream 입니다 ^.^ 역시 빌더의 힘은 대단하죠? 황경록 6711 2005/07/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.