|
간단한 이미지 뷰어를 만들고 있는데요
다음 이미지를 미리 읽어와서
이미지 로딩하는 시간을 단축시켜 보려고합니다.
스왑버퍼란는 말 뜻이 맞는지는 모르겠는데요^^;;;
현재 TImage 컨트롤 두개를 두고,
한장을 미리 읽어온 다음 버튼을 누르면
아래와 같이 두장을 바꿔치기 합니다.
Image->Visible = false;
tmpImage = Image;
Image = ImageSwap;
ImageSwap = tmpImage;
Image->Visible = true;
바꿔치기 한뒤에
아래와 같이 바로 다음 이미지를 Thread를 이용하여 ImageSwap 에 읽어 오는데,
TImageLoader* ImageLoader = new TImageLoader(ImageSwap,strFile);
스레드가 종료된 다음 위의 스왑 구문이 처리된다는게 문제입니다..
이미지가 큰 경우는 스레드를 쓰기 전 아래의 코드와 속도가 거의 동일하네요^^;;
사실상 스레드가 무의미 해졌네요.
Image->Picture->LoadFromFile(m_strImageFile);
스레드 내부의 Excute() 소스는
void __fastcall TImageLoader::Execute()
{
Image->Picture->LoadFromFile(m_strImageFile);
Synchronize(&Swap);
}
다음과 같이 되있습니다.
Image 와 strImageFile 에서는
생성자로 초기화 하고 있구요.
기본적인 문제는 파악하고 있습니다.
Thread 의 Excute() 안에 vcl 클래스가 쓰이는것...
제가 쓰는 방법에 문제가 있는지 궁금합니다.
해결책이 있다면 어떤것이 있을지...
(GDI+,Graphi32를 이용하면 될까요?)
하나 더 궁금한것은
만약 GDI+ 로 구현한다고 할때..
Image->Canvas->Handle 를 가지고
Drawing 한다면...
이것은 제가 원하는 대로 작동할까요?
아, 한가지 더 ^^;;
GDI+를 써서 직접 테스트 해보고 싶었는데
GDI+를 이용한 이미지 로딩의 간단한 프로그램을 작성해봤습니다.
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
Gdiplus::Graphics graphics(Image1->Canvas->Handle);
// Use GDI+
Gdiplus::Image img(L"c:\\test.jpg");// = new Gdiplus::Image(ws.c_bstr());
graphics.DrawImage(&img,0,0);
// shutdown GDI+
Gdiplus::GdiplusShutdown(gdiplusToken);
위의 내용을 컴파일 하면
[Linker Error] Unresolved external 'GdipFree' referenced from
이것과 같이 링커 에러가 납니다;;;
링커 에러만 뜨면 막막하다는....
사실 제가 직접 테스트 해보고 싶었는데 GDI+를 처음 사용해봐서요^^;;;
고수님들의 조언 부탁드리겠습니다.
Conditional Define 에 STRICT 를 추가 했구요,
|