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

C++빌더 Q&A
C++Builder Programming Q&A
[41599] Re:Re:Re:[질문] 비트맵저장시 리소스 부족에러가 납니다
유영인 Cuperido [cuperido] 1329 읽음    2005-08-22 21:24
넵. XP 같은 경우에도 빠른 주기로 GetDC 와 ReleaseDC 가 반복적으로 일어나면
해제를 제대로 못해주는 것 같습니다.

특별하게 레퍼런스로 이것이 문제다. 라는 것은 공식적으로 나온것은 아니지만,
제가 비슷한 프로그램을 만들시, 이상하게 리소스가 없어져 버리는 문제가 발생되어
디버그 해본 결과 GetDC 와 ReleaseDC 의 반복이 문제가 있었고,
이 것을 전역 변수로 하나 잡아주었더니 해결이 되었습니다.
(순전히 제 경험에 의존한 것이니, GetDC/ReleaseDC 의 문제가 아닐수도 있습니다)

GetDC(0) 을 FormCreate시에 한번만 해주시면 됩니다.

HDC hdDC = GetDC(0);

이런식으로 하시면, hdDC에 바탕화면의 DC 핸들이 저장되고, 이 핸들은 컴퓨터를
리부팅 하지 않는이상 변하지 않습니다. 그래서, 이 것을 계속 사용하시다가
프로그램을 종료시킬때 한번만 Release 해주시면 되겠습니다.


cuperido


다시한번 질문 님이 쓰신 글 :
: delete Capture14 , JPEGIMAGE14  는 FormClose 시 해주었습니다.
:
: ReleaseDC(0, DC14); 를 제일 마지막줄에 넣어주면 되나요. 아님 어디에...
: 그리고 사용하는 OS 는 Win XP Professional 입니다.
:
: 그리고 아래말이 정확히 이해가 안되는데요. GetDC(0) 를 ForeCreate시 한번만 해주어도 됩니까..
: 계속 캡쳐할때마다 반복적으로 안해주어도 되고요...
:
: 쓰레드 안에 GetDC를 넣지 마시고 전역 변수로 하나
: : Create 시에 가지고 계셨다가, Destroy 시에 Release 해주시면 될것 같습니다.
:
:
: 유영인  Cuperido 님이 쓰신 글 :
: : delete Capture14 , JPEGIMAGE14  와..
: : GetDC 와 ReleaseDC가 짝이 안맞는것 같네요.
: :
: : DC14 = GetDC(0);
: : ReleaseDC(0, DC14);
: :
: : 이렇게 두개가 짝이 맞아야 합니다.
: :
: : 그리고 95/98 OS 버젼에서 ReleaseDC 가 완전히 메모리를 해제 못하는
: : 경우가 발생하므로, 쓰레드 안에 GetDC를 넣지 마시고 전역 변수로 하나
: : Create 시에 가지고 계셨다가, Destroy 시에 Release 해주시면 될것 같습니다.
: :
: :
: : cuperido
: :
: :
: : 궁금한 사람 님이 쓰신 글 :
: : : 화면을 캡쳐하는 부분입니다. 물론 아래 코드는 쓰레드 안에 코딩되어 있습니다.
: : : 예전에 유영인님께서 답변을 해주세서 수정해서 해봤는데...마찬가집니다.
: : : 프로그램이 한두시간정도 동작한뒤에 이런에러가 뜨는것 같네요.
: : : 리소스가 부족하다는 에러메세지가 뜹니다. (Out of Resourece....)
: : : 물론 아래 변수들은 모두 전역변수로 선언했습니다.
: : : 프로그램 내구검사용이라 만약 내구검사회수(반복회수) 한 2달정도 계속 프로그램이 실행되고 있습니다.
: : : 그림파일 하나의 용량이 약 700K 정도 되네요. 아래 코딩된 부분이 실행되는 주기는 약 2분정도입니다.
: : :
: : :  //screen capture and save jpg file ------------------------------------
: : : DC14 = GetDC(0);
: : : Capture14 = new Graphics::TBitmap;
: : : JPEGIMAGE14 = new TJPEGImage();
: : :
: : : Capture14->Width  = 1280;
: : : Capture14->Height = 1024;
: : : Capture14->PixelFormat = pf16bit;
: : :
: : : BitBlt(Capture14->Canvas->Handle, 0, 0, 1280, 1024, DC14, 0, 0, SRCCOPY);
: : : sprintf(textname,"정전내구%04d%02d%02d_CNT%06d.jpg", year, month, day, Form14->current_cycle);
: : :
: : : JPEGIMAGE14->Assign(Capture14);
: : : JPEGIMAGE14->CompressionQuality = 100;
: : : JPEGIMAGE14->SaveToFile(textname);

+ -

관련 글 리스트
41592 [질문] 비트맵저장시 리소스 부족에러가 납니다 궁금한 사람 918 2005/08/22
41594     Re:[질문] 비트맵저장시 리소스 부족에러가 납니다 유영인 Cuperido 1027 2005/08/22
41598         Re:Re:[질문] 비트맵저장시 리소스 부족에러가 납니다 다시한번 질문 872 2005/08/22
41599             Re:Re:Re:[질문] 비트맵저장시 리소스 부족에러가 납니다 유영인 Cuperido 1329 2005/08/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.