블로그 이미지
그냥 닥치고 해;
상Q

Notice

Recent Post

Recent Comment

Recent Trackback

Archive

calendar

1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
  • total
  • today
  • yesterday
2015. 11. 21. 14:31 Computer/App.

WPF에서 이미지의 사이즈가 큰 이미지 파일의 이미지를 로드 하는데 프로그램이 "응답 없음"상태로 죽어 버리는 현상 발생했다.


- 이미지 크기가 7000x7000 정도이고 파일 사이즈가 13MB정도하는 이미지를 바인딩하면 메모리의 할당량이 100MB에서 200MB 정도 증가하는 현상 발생 (개당)

- 위의 이미지를 동시에 3개 이상 바인딩하면 프로그램이 죽는 현상 발생

- 이벤트 이름은 "APPCRASH"로서 프로그램이 메모리 할당량이 많을 경우에는 900MB 이상으로 작업관리자에서 확인 됨

- 프로그램이 사용하는 라이브러리 때문에 x86으로만 빌드



이를 해결하기 위해서 구글링을 해 본 결과는 아래와 같다.

그리고 구글링한 내용

http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=1403&rssMode=1&wtype=0

http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=151512&ref=151512

http://stackoverflow.com/questions/3553637/outofmemoryexception-loading-extremely-large-images


결과 먼저 말하면 "해결 불가능" 이다.

내용을 요약하면 

"WPF 의 하나의 프로세스에서 소유할 수 있는 메모리 양은 실제적으로 1.4G가 한계. 그러나 referece monitor 에서 보면 실제로 1G가 한계. 그리고 그래픽에 대한 내용은 따로 관리되는 것으로 확인. 아마 그래서 1G가 한계인 듯, 동시에 큰 이미지를 열려고 해서 문제가 발생..."

".net framwork가 하는 내요이라서 컨트롤이 힘들듯. WPF의 PresentationCore가 처리하는 내용 코드 상에서 처리하는 방법에 한계가 있고, 딱히 방법 없는 걸로 보임"

이렇다.


이 현상의 메모리 할당량은 실행되는 때에 따라 다르고, 컴퓨터 하드웨어 사양에 따라서 다른거 같다.


나름 해결 방법은 이미지 파일의 로드를 메모리 할당량을 체크하여 바인딩 제한 하는 것인데, 이것도 확실한 방법이라고 할 수 없다.


결국은 WPF 에서 여러개의 이미지를 동시에 보여주는 것은 지양해야할 것으로 보임



'Computer > App.' 카테고리의 다른 글

[C#] System.ComponentModel.Win32Exception 에러 처리  (3) 2016.02.05
영상재생중 "apphangb1" 에러 이벤트  (1) 2015.11.21
ClickOnce 설치 경로  (0) 2015.09.19
[C#] 프로세스 종료  (0) 2015.09.19
[C#] WebService Connection Check  (0) 2015.09.19
posted by 상Q
2015. 9. 19. 17:27 Computer/App.

clickonce 설치 경로

C:\Users\Administrator\AppData\Local\Apps\2.0



'Computer > App.' 카테고리의 다른 글

영상재생중 "apphangb1" 에러 이벤트  (1) 2015.11.21
[WPF] 큰 사이즈의 이미지 바인딩 issue  (0) 2015.11.21
[C#] 프로세스 종료  (0) 2015.09.19
[C#] WebService Connection Check  (0) 2015.09.19
[C#] Image TIFF File Create/View  (0) 2015.09.19
posted by 상Q
2015. 9. 19. 17:24 Computer/App.
  1.    
  2. System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("ProcessName");  
  3. if (process.Length > 0)  
  4. {  
  5.     process[0].Kill();  
  6. }  
posted by 상Q