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

C++빌더 Q&A
C++Builder Programming Q&A
[26006] Re:Re:Re:쓰레드 안에 함수를 넣었을때 생기는 문제입니다. 답변 부탁드립니다.
임문환.실업자 [origin] 908 읽음    2003-06-18 20:14
최민우 님이 쓰신 글 :
: 우선 답변 감사드립니다..^^
:
: 음.. 그런데 제가 구지 쓰레드를 사용하려는 목적은..
:
: LoadFromFile(큰 용량 파일)을 하는 도중에.. Cancel 버튼 등을 두어 그것의 클릭이 가능하게 하려고 함인데요.
:
: 기존에 그냥 쓰레드가 아닌 함수만 돌리거나.. 말씀하신대로 Synchronize 함수로 빼서 돌리면..
:
: LoadFromFile 중간에 버튼을 클릭했다 할지라도.. 해당 함수가 끝나야 이벤트가 발생합니다.
:
: 즉, TTestThread::Execute() 루틴에 직접 함수를 넣으면 중간중간 버튼 클릭 이벤트가 발생하지만..
:
: TTestThread::Execute()에 Synchronize로 함수를 빼서 실행을 시키면, 이벤트가 뒤늦게 발생한다는 것입니다.
:
: 이거 어찌 해결할 수 있는 방법이 없을까요?

TThread에는 Terminated 속성과 Terminate() 메서드가 있습니다.
Execute 메서드 또는 그 곳에서 호출된 메서드 내에서는 Terminated 속성 값을 주기적으로 검사해주어야 합니다.
보통 이들 메서드 내에서는 루프를 돌려서 작업을 하게 되는데 Terminated 속성 값이 true면 해당 메서드와 Execute 메서드 실행을 종료하도록 설계합니다.
Terminate()와 Terminated가 아닌 새로운 메서드와 속성을 만들어 그런식으로 작동하도록 할 수도 있습니다. 예를 들어, Abort()와 Aborted를 만들어 사용할 수도 있습니다.


무엇보다도 님이 말씀하신 LoadFromFile 메서드가 이 속성의 값을 주기적으로 검사해야 합니다.
이 메서드가 그런식으로 설계되지 않았거나 Terminated 속성 값 검사 주기가 비정상적으로 길다면 Terminate()를 호출하더라도 바로 응답이 오지는 않겠지요.

Terminate()를 호출하는 것이 곧 스레드를 강제 종료시키는 것은 아닙니다.
Terminate() 호출은 단지 Terminated를 true로 설정하기만 합니다.


그리고, TTestThread 내에서 Form1에 정보를 전달하는 것은 이해가 가는데 Form2->Close()를 할 필요가 있나요?
Form2에서 TestThread를 제어하고 있으므로 Form2에서 Cancel 버튼을 누르면 스레드는 스스로 종료되게 하고 Form2도 자신 스스로 닫도록 설계하는게 바람직하겠습니다.








+ -

관련 글 리스트
25976 쓰레드 안에 함수를 넣었을때 생기는 문제입니다. 답변 부탁드립니다. 최민우 732 2003/06/17
25986     Re:쓰레드 안에 함수를 넣었을때 생기는 문제입니다. 답변 부탁드립니다. 임문환.실업자 1109 2003/06/17
25999         Re:Re:쓰레드 안에 함수를 넣었을때 생기는 문제입니다. 답변 부탁드립니다. 최민우 774 2003/06/18
26006             Re:Re:Re:쓰레드 안에 함수를 넣었을때 생기는 문제입니다. 답변 부탁드립니다. 임문환.실업자 908 2003/06/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.