|
넵. 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);
|