|
이희성 님이 쓰신 글 :
: Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
: Byte *ptr;
: try
: {
: pBitmap->LoadFromFile("C:\\Program Files\\Common Files\\Borland Shared\\Images\\Splash\\256color\\factory.bmp");
: /// 이렇게 파일에서 읽어오는 것 말고 네트윅으로 들어온 데이타를 사용하면 되겠죠..한라인씩 아래 loop처럼
: /// 복사해주면 되지 않을까요..
: for (int y = 0; y < pBitmap->Height; y++)
: {
: ptr = (Byte *)pBitmap->ScanLine[y];
: for (int x = 0; x < pBitmap->Width; x++) ptr[x] = (Byte)y;
: }
: Canvas->Draw(0,0,pBitmap); /// 드로잉 하겠죠?
: }
: catch (...)
: {
: ShowMessage("Could not load or alter bitmap");
: }
: delete pBitmap;
:
: 위의 소스는 외랑님이 주신 소스입니다.. 이해가 안가는 부분이 있습니다
: FOR문 안이 이해가 가질 않습니다 TCP로 데이타를 전송받을건데...
:
: 저렇게 프로그램을 하면 FOR문때문에 저걸하는동안 다른 데이타를 전송받지 못하지않나여..?
: 저프로그램이 실행되는동안 계속해서 어떤 데이타를 보내야 하기 때문입니다..
:
: 아니면 폼을 따로 만들어 포문으로 돌려야 하나여? 그것도 쉬원치 않으면 타이머를 이용해 값을 받아야 하나여?
: 그폼만 아무것도 못하는건지 아니면 전체프로젝트가 아무것도 못하는건가요?
우선, 네트워크에서 데이터를 주고받을 때 그 양이 작은 경우에는 일거에 모두 보내고 받을 수 있지만 왠만한 BMP 파일이라면 일거에 되지 않고 수회에 나누어서 전송과 수신을 하게 됩니다.
이를 처리하는 방식에 있어서, 전송받는 컴포넌트/함수 등(이하 '컴포넌트')의 작동 방식은 크게 두 가지가 있습니다.
1. 컴포넌트의 내부에서 (수회에 걸쳐) 모두 전송받은 후 그 결과물을 컴포넌트 사용자에게 돌려주는 방식
2. 컴포넌트에서 (수회에 걸쳐) 전송받을 때 마다 전송받았다고 이벤트로 알려주거나 콜백함수를 실행시키면 컴포넌트 사용자 쪽에서 전송받은 내용물을 가져다 이용하는 방식
1의 경우, 컴포넌트 사용자 입장에서는 컴포넌트의 해당 메서드가 데이터를 모두 받은 후 리턴되거나 모두 다 받았다는 이벤트가 발생하면 그 때에 전송받은 전체 데이터로 작업하면 됩니다.
2의 경우, 컴포넌트 사용자 쪽의 이벤트핸들러나 콜백함수에서 전송받을 때 마다 데이터를 차곡차곡 저장해두었다가 모두 받으면 그 데이터로 작업하거나 복잡해질 수 있겠지만 전송받을 때마다 나누어서 작업할 수 있습니다.
결국, 어떤 컴포넌트나 함수를 사용하여 raw 데이터를 전송받을지 결정한 후 그 컴포넌트의 작동방식에 따라 작업하시면 되겠습니다.
|