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
[41523] Re:Re:Re:Re:[질문] 쓰레드안에서 화면 캡쳐해서 파일 저장지 Resource 부족 에러가 납니다.
남자 [] 923 읽음    2005-08-18 19:21
죄송한데....
한 12시간 이상  돌려서 확인해 주실수 없는지요....
프로그램이 한 2달이상 돌아야 하는데....

유영인  Cuperido 님이 쓰신 글 :
: 좀 오래 돌려야 발생되는 에러인가요? 전 코드대로 작성해서 10분 정도 돌려도..
: 에러가 발생하지 않던데요..
:
: 우선, 아래 사항에 최적화 해야 할 부분과, 문제점으로 의심가는 부분 적어드립니다.
:
: 1. Win 98 에서 빠른 속도로 진행시 ReleaseDC의 메모리 반환 문제가 있어, 초기에
: GetDC를 사용하여 HDC를 전역에 저장
:
: 2. UpdateDisplay 함수 내에서는 while 문이 필요가 없음.
:
: 3. 쓰레드가 엄청난 속도로 계속 실행이 되기 때문에, CPU 율이 높아지고,
: 컴퓨터에 따라서는 이것을 못견딜수도 있음. 따라서, 적당한 간격의 Sleep이 필요함
:
: 4. 쓰레드 안에서 new 와 delete를 하고 이미지를 캡쳐 하는 것은 속도에 영향이 큼
:
: 5. Canvas의 DC를 지정해 주지 않아도 Bitblt API를 이용하면 HDC 내에서 바로 이미지를 뽑아
: 올 수 있음.
:
:
: 아래는 그렇게 해서 조금 고쳐본 소스입니다.
: 프로그램의 흐름에 따라 알맞게 더 고쳐주세요..
:
:
: cuperido
:
: //---------------------------------------------------------------------------
:
: #include <vcl.h>
: #include <stdio.h>
: #include <jpeg.hpp>
: #pragma hdrstop
:
: #include "Unit2.h"
: #include "Unit1.h"
: #pragma package(smart_init)
:
: HDC               DC;
: Graphics::TBitmap *CAPTURE;
: TJPEGImage        *JPEGIMAGE;
:
: //---------------------------------------------------------------------------
:
: //   Important: Methods and properties of objects in VCL can only be
: //   used in a method called using Synchronize, for example:
: //
: //      Synchronize(UpdateCaption);
: //
: //   where UpdateCaption could look like:
: //
: //      void __fastcall Unit2::UpdateCaption()
: //      {
: //        Form1->Caption = "Updated in a thread";
: //      }
: //---------------------------------------------------------------------------
:
: __fastcall TTest::TTest(bool CreateSuspended)  : TThread(CreateSuspended)
: {
:
:  FreeOnTerminate = TRUE;
:  Resume();
:
: }
: //---------------------------------------------------------------------------
: void __fastcall TTest::Execute()
: {
:
:  DC        = GetDC(0);
:  CAPTURE   = new Graphics::TBitmap;
:  JPEGIMAGE = new TJPEGImage();
:
:  // 그림 크기를 화면 크기로 설정
:  CAPTURE->Width  = Screen->Width;
:  CAPTURE->Height = Screen->Height;
:
:  // 캡쳐 속도를 빠르게 하기 위하여 16비트 이미지로 연산
: // CAPTURE->PixelFormat = pf16bit;
:
:  while(!Terminated) {
:    UpdateDisplay();
:    Sleep(500);
:  }
:
:  ReleaseDC(0, DC);
:  delete CAPTURE;
:  delete JPEGIMAGE;
:
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TTest::UpdateDisplay(void)
: {
:
:  BitBlt(CAPTURE->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, DC, 0, 0, SRCCOPY);
:
:  // 파일 이름 설정.
:  strcpy(textname, "HELLO.JPG");
:
:  JPEGIMAGE->Assign(CAPTURE);
:  JPEGIMAGE->CompressionQuality = 100;
:  JPEGIMAGE->SaveToFile(textname);
:
: }
:
:
: Man 님이 쓰신 글 :
: : Unit1.h file
: : class Tthread_A : public TThread
: : {
: :      public:
: :              __fastcall Tthread_A(void);
: :           int asyn_count, test_number;
: :           char textname[100];
: :           double atest_cur;
: :           double agraph_time;
: :      private:
: :              void __fastcall Execute(void);
: :           void __fastcall UpdateDisplay(void);
: :           void __fastcall ATestGraph(void);
: : };
: :
: : Unit1.cpp
: : __fastcall Tthread_A::Tthread_A(void) : TThread(TRUE)
: : {
: :      FreeOnTerminate = TRUE;
: :      Resume();
: : }
: : //---------------------------------------------------------------------------
: : void __fastcall Tthread_A::Execute(void)
: : {
: :      while(!Terminated) {
: :              UpdateDisplay();
: :      }
: : }
: : //---------------------------------------------------------------------------
: : void __fastcall Tthread_A::UpdateDisplay(void)
: : {
: :     while(!Terminated) {
: :         //이 안에 질문한 코드가 있습니다.
: :     }
: : }
: : 그리고 쓰레드 호출은 thread_A = new Tthread_A;  이렇게 했습니다.
: : 참 그리고 최적화가 안된 부분은 어디입니까.
: :
: :
: :
: : 유영인  Cuperido 님이 쓰신 글 :
: : : 쓰레드 생성 부분과,  돌아가는 부분 (정확히 말해 호출 되는 부분) 까지 함께 올려주셔야..
: : : 정확한 답변을 해드릴 수 있지 않을까 싶습니다. :)
: : :
: : : 간단한 프로젝트를 하나 만들어서 첨부해 주시면 더더욱 좋겠지요..
: : : 아래 내용만으로는 특별한 에러는 못찾겠군요.. (최적화가 안된 부분만 살짝 있구.. ^^) :(
: : :
: : : cuperido
: : :
: : : 남자 님이 쓰신 글 :
: : : : 안녕하세요.
: : : :
: : : : 쓰레드 안에 아래와 같이 코딩을 했습니다.
: : : : 화면을 캡쳐해서 파일로 저장하는 부분인데... (물론 볼랜더포럼에서 검색해서 코드를 찾아꾸요...ㅋㅋㅋ)
: : : : 쓰레들를 돌리다 보면 어느 순간에 TJPEGImage .... Resource Error 인가 부족인가 그와 비슷한 에러가 나옵니다.
: : : : Resource 로 검색해서 보니 쓰레드안에서 이런 문제가 발생하는 경우의 질문이 몇가지 있더군요...
: : : : Synchronize 로 처리해도 안된다고 되어있던데....
: : : :
: : : : 혹시 이 문제를 해결할 방법이 없나요.
: : : :
: : : :                     HDC dc = GetDC(0);
: : : :                     Graphics::TCanvas *ScreenCanvas = new Graphics::TCanvas;
: : : :                     ScreenCanvas->Handle = dc;
: : : :
: : : :                     Form14->Image3->Picture->Bitmap->Width  = 1280;
: : : :                     Form14->Image3->Picture->Bitmap->Height = 1024;
: : : :
: : : :                     TRect rect;
: : : :                     rect = Rect(1, 1, 1280, 1024);
: : : :                     Form14->Image3->Picture->Bitmap->Canvas->CopyRect(rect, ScreenCanvas, rect);
: : : :                     if(Form14->capture_value == 0) {
: : : :                          Form14->Image3->Picture->Bitmap->Canvas->CopyRect(rect, ScreenCanvas, rect);
: : : :                     }
: : : :                     delete ScreenCanvas;
: : : :                     ReleaseDC(NULL, dc);                               
: : : :                     Form14->capture_value = 1;
: : : :
: : : :                     //jpeg file------------------------------------------------------------
: : : :                     sprintf(textname,"%s_%06d.jpg", DurTestPattern14.filename, Form14->current_cycle);
: : : :                     TJPEGImage *MyJpg = new TJPEGImage();
: : : :                     MyJpg->Assign(Form14->Image3->Picture->Bitmap);
: : : :                     MyJpg->CompressionQuality = 100;
: : : :                     MyJpg->SaveToFile(textname);
: : : :                     delete MyJpg;

+ -

관련 글 리스트
41359 [질문] 쓰레드안에서 화면 캡쳐해서 파일 저장지 Resource 부족 에러가 납니다. 남자 979 2005/08/07
41360     Re:[질문] 쓰레드안에서 화면 캡쳐해서 파일 저장지 Resource 부족 에러가 납니다. 유영인 Cuperido 935 2005/08/07
41363         Re:Re:[질문] 쓰레드안에서 화면 캡쳐해서 파일 저장지 Resource 부족 에러가 납니다. Man 981 2005/08/08
41370             Re:Re:Re:[질문] 쓰레드안에서 화면 캡쳐해서 파일 저장지 Resource 부족 에러가 납니다. 유영인 Cuperido 891 2005/08/08
41523                 Re:Re:Re:Re:[질문] 쓰레드안에서 화면 캡쳐해서 파일 저장지 Resource 부족 에러가 납니다. 남자 923 2005/08/18
41524                     Re:Re:Re:Re:Re:[질문] 쓰레드안에서 화면 캡쳐해서 파일 저장지 Resource 부족 에러가 납니다. 유영인 Cuperido 859 2005/08/18
41427                     Re:Re:Re:Re:Re:[질문] 쓰레드안에서 화면 캡쳐해서 파일 저장지 Resource 부족 에러가 납니다. 남자 868 2005/08/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.