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

델파이 Q&A
Delphi Programming Q&A
[10625] 감사합니나^^; 내용무
델짱 [] 1105 읽음    2006-04-03 11:46
박지훈.임프 님이 쓰신 글 :
: 서브 쓰레드에서 호출하는 경우 사이의 간섭이 아니라 메인 쓰레드에서의 호출도 관여된다는 말씀이신 거 같은데요.
: 그런 경우라도 마찬가지입니다.
:
: 먼저 서브 쓰레드 사이에서는 간섭이 있을 수 없다고 설명드렸지요.
: Synchronize 함수의 역할이 메인 쓰레드로 실행을 위임하는 것이므로, 일단 Synchronize로 함수의 실행이 넘어가고
: 나면 더이상 서브 쓰레드에서 실행되는 것이 아니라 메인 쓰레드로 넘어갑니다.
: 메인 쓰레드 자체는 하나만 존재하므로 두번 진입이 안되죠.
: 따라서 반드시 한번만 실행되고 동시에 두번 이상 실행될 수는 없습니다.`
:
: 그럼...
:
:
: 델짱 님이 쓰신 글 :
: : 답변감사 드립니다.
: : 제 질문에 혼돈의 소지가 있었네요
: : 다시 말씀 드리면.
: : 만약에 쓰레드에서도 시리얼로 출력하고 있고
: : 메인폼에서 버튼 클릭으로 동일한 함수를 호출하여 시리얼로 출력요청 한다면
: : 상호 간섭이 생기는지 즉
: : Synchronize 는 쓰레드 내에서 함수를 동기화 시켜주는것으로 압니다 , 메인폼에서 쓰레드에서 사용하고 있는
: : 함수를 호출하면 상호 간섭이 생길것으로 추정되는데 맞는지요?
: :
: : 박지훈.임프 님이 쓰신 글 :
: : : 요약하자면, Synchronize를 통해 똑같은 함수가 여러 쓰레드에서 호출이 가능할 때 그 호출들 사이에 간섭이 발생할 수
: : : 있지 않느냐는 말씀인 거 같은데요. 그런 경우는 발생할 수 없으니 안심하셔도 됩니다.
: : : 만약 걱정하시는 것처럼 Synchronize를 통한 호출들 사이에 간섭이 발생한다면 Synchronize 함수가 의미가 없겠죠?
: : :
: : : TTread의 Synchronize 함수의 구현은 델파이 5까지의 버전과 6 이상의 버전 사이에 구현이 다릅니다.
: : :
: : : 델파이5 버전까지에서는 Synchronize 함수의 동작을 위해 윈도우 핸들을 이용합니다.
: : : 화면상으로는 안보이는 공용의 윈도우 핸들을 하나 만들어놓고, Synchronize 함수가 호출되면 SendMessage 함수로
: : : 그 윈도우로 메시지를 보냅니다. 이 윈도우 핸들의 윈도우 프로시저는 메인 쓰레드에서 동작하므로 Synchronize 함수를
: : : 통해 호출된 함수가 메인 쓰레드에서 동작하는 것이 보장되는 것입니다.
: : :
: : : 또 한편으로, 메시지로 보내어 메인 쓰레드의 메시지큐를 통해 실행시키므로, 하나의 호출이 완료되기 전에는 다른
: : : 메시지를 처리하지 않게 되므로 문제가 없습니다. 따라서 TThread를 상속받은 쓰레드가 백개이든 천개이든 그리고
: : : 상속받은 클래스 타입이 여러개인 경우라도 이 쓰레드의 내부 윈도우 핸들로 진입하는 루틴은 메시지큐에 의해 반드시
: : : 한번에 하나씩만 가능하게 됩니다.
: : :
: : : 델파이 6 이상 버전에서는 크리티컬 섹션을 이용하므로, 메시지큐를 이용하는 방법보단 아무래도 더 믿음직스럽습니다.
: : : Synchronize 함수 자체에서 바로 EnterCriticalSection 함수와 LeaveCriticalSection 함수를 통해 한번만 진입하도록
: : : 제한하므로 두번 이상의 진입이 있을 수 없습니다.
: : :
: : : 참고로, TThread 클래스의 구현은 델파이5 이하 버전의 방식보다 델파이6 이상의 구현이 훨씬 더 잘 되어 있습니다.
: : : 델파이5 이하 버전의 TThread 구현은 여러모로 문제가 좀 있습니다. TThread를 많이 사용하신다면 최소 델파이6 이상으로
: : : 업그레이드하시는 편이 좋습니다.
: : :
: : : 그럼...
: : :
: : :
: : : 델짱 님이 쓰신 글 :
: : : : ---**쓰레드와  메이폼 버튼 클릭시 사용될 공용 시리얼 출력함수
: : : :
: : : : procedure Tfrom1.Func1(str : string);
: : : : begin
: : : :   with Query1,Query1.SQL do
: : : :   begin
: : : :      Close;Clear;
: : : :      Add('select remark from contents where aaa = '''+str'''');
: : : :      Open;
: : : :      while not eof do  // while loop가 50회 정도된다면...
: : : :      begin 
: : : :         Comport.WriteStr( fieldbyname('remark').AsString);
: : : :         Next;
: : : :      end;
: : : :   end;
: : : : end;
: : : :
: : : :
: : : : --** 쓰레드에서시 호출하는 루틴
: : : :
: : : : procedure TMyThread.Execute;
: : : : begin
: : : :   while (not Terminated)  do begin
: : : :     try
: : : :       Msg := from1.Client1.ReadLn;
: : : :       if Length(Msg) >= 1 then begin
: : : :          Synchronize(Func1('Msg'));
: : : :     except
: : : :       Terminate;
: : : :     end;
: : : :   end;
: : : : end;
: : : :
: : : :
: : : :
: : : : ---**메인 폼에서 버튼클릭시 Func1 사용하는 루틴
: : : :
: : : : procedure Tfrom1.button1Click(sender :Tobject);
: : : : begin
: : : :    Func1('Y');
: : : : end;
: : : :
: : : :
: : : :
: : : :
: : : : 안녕하세요~
: : : :
: : : : 시리얼로 출력을 하는 public 함수 "Func1" 을 쓰레드에서
: : : :
: : : : Synchronize 로 동기화 하여 호출 사용하고
: : : :
: : : : 메인폼에서 버튼을 클릭하면 역시 "Func1"  사용할수 있는 환경에서...
: : : :
: : : : 
: : : :
: : : : 쓰레드에서 Func1 호출하여 50회 정도 루프를 돌면서 시리얼로 text를 전송하고 있는 도중에
: : : :
: : : : 메인폼에서 버튼을 클릭하여 역시 50회 돌면서 text 를
: : : :
: : : : 전송하면 상호 간섭이 발생되지 않을까요?
: : : :
: : : :
: : : : 예를 들면 쓰레드에서 호출한 Func1이 50회를 돌면서  1 ~ 50 까지 숫자를 출력 도중에
: : : :
: : : : 난데없이 메인에서 Func1  호출하여 51 ~ 100 까지 숫자
: : : :
: : : : 출력호출하면
: : : :
: : : : 출력 결과가  1~30 까지 나오고 다음에 51~100까지 나오고
: : : :
: : : : 그다음에 31 ~ 50 까지 출력 되는 어이 없는 경우가 발생되지는 않는지?..
: : : :
: : : :
: : : : 물론 1-50까지 출력은 아주 짧은 시간내에 출력이 되기 때문에
: : : : 별 문제없이 출력 됩니다마는 만약 굉장히 긴 Loop를 돌고 있다면
: : : :
: : : : 혹시 상호 간섭으로 섞여 나올수 있을수도 있게다 싶어 여러분들의
: : : :
: : : : 조언을 듣고 싶습니다.
: : : :
: : : : 만약 이상없이 출력 된다면 혹은 섞여서 출력 되는
: : : :
: : : : 문제가 발생되는지 그 원리가 아주 아주 궁금합니다.

+ -

관련 글 리스트
10608 [질문]Fucn1 이라는 시리얼 출력 함수를 쓰레드와 일반호출에서 동시 사용한다면... 델짱 1160 2006/03/31
10611     Re:[질문]Fucn1 이라는 시리얼 출력 함수를 쓰레드와 일반호출에서 동시 사용한다면... 박지훈.임프 1422 2006/03/31
10612         Re:Re:[질문]Fucn1 이라는 시리얼 출력 함수를 쓰레드와 일반호출에서 동시 사용한다면... 델짱 1239 2006/03/31
10613             Re:Re:Re:[질문]Fucn1 이라는 시리얼 출력 함수를 쓰레드와 일반호출에서 동시 사용한다면... 박지훈.임프 1294 2006/03/31
10625                 감사합니나^^; 내용무 델짱 1105 2006/04/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.