Q&A

  • 마우스로 폼 크기 조절할 때 문제 발생
안녕하세요..

바로 질문드리겠습니다.

제목대로 마우스로 어플리케이션의 닫기버튼(X) 근처에 마우스를 가져다 놓으면 폼을 리사이즈할 수 있는 형태로 마우스 커서(?)의 모양이 바뀝니다.

이 상태에서 폼의 크기를 몇 차례 연속으로 조절하면 '매개 변수가 틀립니다'라는 메시지 창이 나오면서
어플리케이션이 종료됩니다.
(메시지 창의 개수를 헤아리기 힘들 정도로 많이..)
그리고 폼의 크기를 조절하는 순간 CPU의 사용율이 50%이상으로 올라가는 현상이 발생합니다.

이 현상은 windows 2000 에서는 '바탕화면- 등록정보 - 효과탭 - 마우스 끄는동안 창내용표시' 옵션을
XP에서는 '바탕화면 - 등록정보 - 화면배색탭 - 효과버턴 - 마우스 끄는동안 창내용표시' 옵션을
체크했을 때만 발생합니다.

이와 관련하여 게시된 글을 살펴봤는데
최용일님이 올리신 WM_SIZE메세지 를 이용하라는 것과
모영철님이 올리신 WM_SIZE 메세지와 wParam의 SIZE_RESTORED 를 이용하라는 내용이 있는데
내공부족으로 인해 처리하지 못했습니다.

이 문제의 해결책을 애타게 찾고 있습니다.
방법을 알려주세요~~~
(코드로 알려주시면 더욱더 좋고요~~ ^^)
5  COMMENTS
  • Profile
    프리맨 2005.10.08 17:01
    '매개 변수가 틀립니다' 메시지는 리소스가 부족해서 비트맵 생성에 실패할 경우에도 나타납니다.
    폼을 그릴때 비트맵 해제가 제대로 이뤄지지 않아서 계속 누적되는듯 하네요.
    혹시 쓰레드를 이용해 폼을 그리시나요?
    TBitmap은 쓰레드상에서 리소스를 반환하지 못하는 버그를 가지고 있습니다.
    이 문제는 적절한곳에서 Dormant를 호출해주면 해결할수 있습니다.
    어떤 구조인지 모르니 이 정도 밖에는 답변드릴수 없네요.

    그리고 CPU사용율은 폼 그리는 속도가 커서 움직이는 속도보다 오래걸린다면 100% 되는것은
    당연하구요.. 50% 정도라면 HT 쓰시는것 같은데요?


    PS.
    델파이 2005에서는 비트맵 리소스 버그가 나타나지 않는군요..
    2005를 쓰신다면 다른 문제일 수 있습니다.

  • Profile
    Jung 2005.10.10 19:16
    답변 감사합니다.

    TBitmap은 메인메뉴와 툴바의 툴버튼에 사용합니다만, 쓰레드는 사용하지 않고,
    프로젝트 파일에서 'Application.CreateForm'으로 호출하여 폼을 생성합니다.
    (메인메뉴는 10여가지이고 툴버튼은 7가지 입니다.)

    버전은 Delphi 7이고, OS는 Windows2000 Pro 입니다.
    구조는 DataModule에 TActionManager를 올려서 메인화면에 사용될 각 메뉴(툴버튼)를 정의하였고,
    이때, 각 메뉴(툴버튼)에 TImageList에 등록된 Bmp이미지를 지정했습니다.

    메인화면에서는 TActionMainMenuBar와 TActionToolBar를 사용해서 화면에 메인메뉴와 툴버튼을 보여주는 구조입니다.

    적절한 곳에서 Dormant를 호출한다라고 하셨는데, 이해가 안되는 부분입니다. 좀 더 설명 부탁드립니다.


  • Profile
    하늘바람 2005.11.05 06:48



    제가 보기엔 위사항은 폼을 호출하고 다시 free 상태로 돌려 놓지 않아서 메모리를 잠식하는것 같아요^^
  • Profile
    프리맨 2005.10.10 22:21
    Dormant 를 호출하는것은 비트맵 리소스가 새는 부분의 직전에 해줘야 합니다.
    하지만 어디에서 샌다고 꼭집어 말씀드리기 어렵네요. 쓰레드와 비트맵을 어떻게
    구성하느냐에 따라 달라지고 저도 모든 패턴을 시험해본게 아니어서 그렇습니다.
    게다가 델파이7에 그 버그가 해결 됐을수도 있구요.. 더구나 쓰레드를 사용하지
    않으신다니 Dormant가 해결방법이 될순 없을듯 하네요..

    일단 '매개 변수가 틀립니다' 메시지가 왜 나오는지 확인하셔야 하는데 이 메시지는
    정말 매개 변수가 틀릴때 나올수도 있고 또는 어떤 리소스의 할당에 실패한후
    실패한 리소스 핸들로 다른 API함수를 호출했을때 발생할수도 있습니다.

    에러를 내보면서 작업관리자에서 메모리,GDI, 핸들 등이 급격히 올라가는지 확인해보세요.
    올라가지 않는다면 리소스문제라기 보다는 어떤 API함수에 인자가 잘못 사용된것입니다.
    그 함수가 무엇이고 인자가 왜 잘못들어가는지는 계속 디버깅을 해보시는 수 밖에 없겠네요.

    참고로 이런문제는 VCL의 버그일 가능성이 큽니다.
    컴파일 옵션에서 Use debug DCUs 를 켜고 Build 한후 디버깅 해보세요.


  • Profile
    Jung 2005.10.10 22:40
    프리맨님 답변 고맙습니다.