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
[1082] [퀴즈] 다음 코드의 위험요소를 찾아보세요
장성호 [nasilso] 13763 읽음    2012-03-28 20:48
다음과 같이 화면이 구성되어있습니다.



그리고 다음과 같이 쓰레드에서 코딩했습니다.

//---------------------------------------------------------------------------
// 쓰레드 클래스 소스 
class TMyThread: public TThread
{
	public:
		__fastcall TMyThread()
			: TThread(false)
		{
			FreeOnTerminate=true;
		}
		void __fastcall Execute()
		{
			while(!Application->Terminated)
			{
				Sleep(1000);
				//1초 간격으로 Form1의 Panel에 user메세지를 보냄
				SendMessage(Form1->Panel1->Handle,WM_USER+1,0,0);
				PostMessage(Form1->Panel2->Handle,WM_USER+1,0,0);

			}

		}
};
//--------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
       //Form생성완료후 쓰레드를 생성해줌 
	new TMyThread;
}
//---------------------------------------------------------------------------



위와같이 해서 실행하면...
이상한 에러가 나거나 화면이 버벅거림 또는 행이 걸릴수 있습니다.

왜 그럴까요?

//----------------------------

위코드에서
Form1이 global객체라서 위험요소일 수 있는데..
예전에 다뤘던 사항이라 논외로 하겠습니다.

그럼..
꼬부기 [turtle1223]   2012-03-28 21:00 X
초보라서 잘은 모르지만 2가지 경우가 떠오르네요...

1. Panel1에 SendMessage로 보냈기 때문에 리턴을 기다린다.

2. Panel1이 TabSheet상에서 활성일때 Panel2로 PostMessage를 보내고 Panel2가 TabSheet 상에서 활성일때 Panel1에 SendMessage를 보내기 때문이 아닐까요...
장성호 [nasilso]   2012-03-28 21:51 X
아닙니다~!

코드만 봐서 답을 찾기 어려우면, 프로젝트를 하나 만들어서 ... 디버깅 해보세요

--------------------------

앗참 답을 잘 아시는 고수분들께서는  천천히 답변달아 주세요~!

Lyn [tohnokanna]   2012-03-29 02:38 X
얘기해두 되요? ㅡ,.ㅡ;
Frigate [devilica]   2012-03-29 18:29 X
디버깅을 해보니 컨트롤에 메세지를 보낸 후에 CM_FOCUSCHANGED 메세지가 먼저 발생하는군요.
핸들값에 해당하는 컨트롤이 포커스를 받을 수 없는 상태인 경우엔 그상태로 블럭이 되어, 메세지 루프가 정상적으로 동작하지 않는군요. 메세지를 보내기 전에 해당 컨트롤에 대해서 CanFocus로 확인한 다음 보내던지, Synchronize로 감싸서 처리하던가 하면 정상적으로 동작하네요.
장성호 [nasilso]   2012-03-29 20:47 X
Frigate님
정답이 아닙니다.

Syncronize로 감싸면 당연히 문제없습니다.

-----------------------------------------
힌트를 드리겠습니다.

Panel1과 Panel2 를 PageControl 안에 올리지 마시고 ,
그냥 Form위에 바로 올려서 프로그램을 돌려보세요

배일수 [g30001]   2012-06-20 17:18 X
흠 빌더는 저런 구조로 되어있군요..
흠 흥미롭네.ㅋㅋ
WM_USER+1?

+ -

관련 글 리스트
1082 [퀴즈] 다음 코드의 위험요소를 찾아보세요 장성호 13763 2012/03/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.