|
좀 오래 돌려야 발생되는 에러인가요? 전 코드대로 작성해서 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;
|