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
[41427] Re:Re:Re:Re:Re:[질문] 쓰레드안에서 화면 캡쳐해서 파일 저장지 Resource 부족 에러가 납니다.
남자 [] 867 읽음    2005-08-11 17:09
남자 님이 쓰신 글 :
: 2개의 쓰레드가 돌기 때문에 동기화시킬수가 없습니다.
: 그리고 저는 한 1시간 넘게 돌렸을때 발생한네요...
  그리고 Win 98 아니고 XP Professional 사용합니다.
: 일단 참조해 보겠습니다.
: 감사합니다.
:
: 유영인  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 부족 에러가 납니다. 남자 867 2005/08/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.