C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1099] [VCL] Application.ProcessMessages 이 나쁜놈~!
장성호 [nasilso] 15398 읽음    2012-08-13 14:20
음..

[VCL에서 가장 잘못 만든 함수]

예전에 퀴즈형식으로 이 게시판에
Application.ProcessMessages 함수의 문제점 또는 그 비슷한 상황에서의 문제점을 얘기한적이 있습니다.

http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=981


하지만 아직 많은 델파이(C빌더)개발자들이
Application.ProcessMessages 문제점을 잘 인지하지 못하고
사용하는 경우를 왕왕보게 되네요

개인적으로
VCL에서 가장 잘못 만든 함수는
Application.ProcessMessages 라고 생각합니다.


쓰레드를 잘 다룰줄 모른다거난
아직 VCL 에 익숙하지 않는 분에께는 꼼수로 유용히 쓰일수도 있겠지만
이 함수는 사용을 지양해야할 함수입니다.


[Delphi.About.com]  

Delphi.aoubt.com의 Zarko Gajic님도

"The Dark Side of Application.ProcessMessages in Delphi Applications" 라는 제목으로
이문제를 다루었었네요

http://delphi.about.com/od/objectpascalide/a/delphi-processmessages-dark-side.htm

구글 버역 링크
http://translate.google.co.kr/translate?sl=en&tl=ko&js=n&prev=_t&hl=ko&ie=UTF-8&layout=2&eotf=1&u=http%3A%2F%2Fdelphi.about.com%2Fod%2Fobjectpascalide%2Fa%2Fdelphi-processmessages-dark-side.htm&act=url


[결론]

결론은
"Application.ProcessMessages 라는 함수는 없는 놈이라 생각하고
절대 사용하지 말자" 입니다.
Lyn [tohnokanna]   2012-08-13 14:41 X
ㅜㅜ 전 자주 쓰는데
utime.김성하 [utime]   2012-08-13 15:08 X
예전에 꽤 많이 썼던 함수였는데~ ㅎㄷㄷ
Yull [huiso]   2012-08-14 12:56 X
사용자 정의 쓰레드 내부루틴을 제외하곤 아직 사용상에 문제점은 없었습니다. (사용자 정의 쓰레드에선 쥐약이더라구요. 그래서 Sleep을 쓰구요.)
메인쓰레드하에선 Sleep 보단 ProcessMessages 를 더 선호하는 편입니다. (과도하게 써본적은 없어서, 딱 고정도만~)
더 간결하고 효과좋은 함수를 아직 모르는 것도 있구요. ^^
아루스 [tinydew4]   2012-08-14 17:38 X
어떤 작업중에 ProcessMessages 를 넣으니 다른 작업에서 예외가 발생할 경우
그 작업까지 제대로 처리가 안되는 바람에 최대한 없애버렸습니다.
그냥 당장 지워도 차이가 없는거만 지우고 나머진 찝찝하지만 운영상에 크게 문제되는게 없어서 뒀네요. ㅋ
김태선 [cppbuilder]   2012-08-16 10:02 X
저자가 예로든 재귀호출 가능성이야
간단히 조치가 가능한 문제인데
굳이 Application.ProcessMessages 에게 누명을 씌울 필요는 없다고 봅니다.
Application.ProcessMessages는 매우 유용한 메소드입니다.

저는 거의 쓰지 않지만, 메인 쓰레드에서 동작이 잠기지 않게 할때는 유용합니다.

쓰는 사람의 수준 따른 문제이지
Application.ProcessMessages 메소드 자체를 문제시 하는건
누명씌우기 같네요.

델파이 VCL 내에서도 적지 않게 Application.ProcessMessages 사용을 목격할 수 있는데
적절히만 사용하면 아무런 문제가 안된다고 봅니다.
時代遺憾 [cdincdin]   2012-08-21 17:42 X
의견이 분분하네요. 프로세스 내의 시퀀스에 영향을 주지않는 선에서는 사용해도 무방하겠죠?
공무원들은 뭐 좀 처리되는 동안 화면 먹통되면 버튼 안눌리고 막 이러면 욕을 선물해주시더라고요.
빌더(TWx) [builder]   2012-08-22 16:18 X
Zarko Gajic이 쓴 글은 재귀호출과는 아무런 관련이 없는 겁니다.

글의 요지는 어떤 블럭 내에서 텀이 긴.. 이를테면 파일 처리 같은 경우... 작업이 처리될 때...
메인쓰레드가 블럭킹 되는 것을 피하기 위해서 Application.ProcessMessages 를 호출 하더라도...
VCL 프레임웍 구조 자체가 Single Thread 구조라서... 파일 처리에 걸리는 텀 동안 ...
Application.ProcessMessages 자체도 그 텀 동안 블럭킹 상태가 되기 때문에 ..
2차 적으로 버튼을 눌렀을 때.. 프로그램 흐름의 동작 시퀀스 상에 Sync 가 어긋나서 문제가 발생하게 된다는 게 촛점이지..
재귀호출과는 아무런 상관이 없는 내용입니다.
경우에 따라서는 동기가 어긋나는 바람에 엉뚱한 참조가 일어나서 Access violation이 일어 날수도 있을 테고요...

Zarko Gajic이 글에서 언급한대로 VCL 프레임웍의 구조적인 한계 때문에 Application.ProcessMessages 는 생각을 하면서 써야 합니다.

그리고 델파이 VCL 내에서 Application.ProcessMessages가 사용되는 경우는 VCL 내의 해당 루틴이 위와 같은 동작 시퀀스 상의 문제와
관련이 없어서 고려할 필요가 없기 때문인 거지, VCL에서 적지 않게 사용이 목격 된다고 해서 무턱 대고 사용할 건 아니죠.

장성호 [nasilso]   2012-08-24 02:00 X
중국 출장와 있는데.. 댓글이 여럿 달렸네요. 감사~!
저와 다른 의견을에 더욱 감사합니다.

여기 포럼과 델마당 Q&A에
Application.ProcessMessages 로 해결하라는 답변을 종종 봅니다.

문제점에 대해서는 얘기하지 않고,  그것이 최선의 해결책인양~!

그런 답변 다신 분들이
대부분 함수에 문제가 있다는 것 조차 잘 모르고 있다는 생각이 들더군요


글 제목이 좀 오버스러웠던 것은
개발자들에게 경각심을 주고자 함이었습니다.


+ -

관련 글 리스트
1099 [VCL] Application.ProcessMessages 이 나쁜놈~! 장성호 15398 2012/08/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.