|
죄송한데....
한 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;
|