|
저는 방향 및 솔루션을 제시해 드리고,
개발과 테스트는 '남자' 님이 하셔야 할 몫입니다. ^^;
제품의 제작자는 제가 아니라 '남자' 님이시잖아요.. :D
cuperido
남자 님이 쓰신 글 :
: 죄송한데....
: 한 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;
|