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
[10613] Re:Re:Re:[질문]Fucn1 이라는 시리얼 출력 함수를 쓰레드와 일반호출에서 동시 사용한다면...
박지훈.임프 [cbuilder] 1294 읽음    2006-03-31 13:21
서브 쓰레드에서 호출하는 경우 사이의 간섭이 아니라 메인 쓰레드에서의 호출도 관여된다는 말씀이신 거 같은데요.
그런 경우라도 마찬가지입니다.

먼저 서브 쓰레드 사이에서는 간섭이 있을 수 없다고 설명드렸지요.
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 이라는 시리얼 출력 함수를 쓰레드와 일반호출에서 동시 사용한다면... 델짱 1161 2006/03/31
10611     Re:[질문]Fucn1 이라는 시리얼 출력 함수를 쓰레드와 일반호출에서 동시 사용한다면... 박지훈.임프 1423 2006/03/31
10612         Re:Re:[질문]Fucn1 이라는 시리얼 출력 함수를 쓰레드와 일반호출에서 동시 사용한다면... 델짱 1240 2006/03/31
10613             Re:Re:Re:[질문]Fucn1 이라는 시리얼 출력 함수를 쓰레드와 일반호출에서 동시 사용한다면... 박지훈.임프 1294 2006/03/31
10625                 감사합니나^^; 내용무 델짱 1107 2006/04/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.