2011-03-03 4 views
10

나는 Thread.descendent 클래스를 작성했고 execute 메소드에서 com 이벤트를 수신하기 위해 무한 루프를 작성했는데이 작업을 수행하기 위해 무한 루프를 사용하는 잘못된 스레딩 연습으로 간주됩니까? 응용 프로그램이 잘 작동, 동결하지 않고 allways 반응입니다, 난 그냥 스레딩하는 가장 좋은 방법을 사용하기 때문에 나는 대답.TThread.Execute 안에 무한 루프를 두는 것은 나쁜 습관이라고 생각합니까?

procedure TMyThread.Execute; 
begin 
    while True and not Terminated do 
    begin 
    AResult:= FListener.GetResult(Param1,Param2,5000); 
     if not VarIsNull(AResult) then 
     Synchronize(Process); 
    end; 
end; 
+13

루프를 종료하는 이벤트가있는 경우 실제로는 무한하지 않습니다. – drudge

+0

이벤트가없는 경우 FListener.GetResult가 대기합니까? –

+0

'TMyThread.Terminate'를 쓰레드를 멈추려면,'true와 not terminated do' 행을 확인하십시오. 여기서 스레드가 종료되었는지 확인합니다. ' – Salvador

답변

7

괜찮습니다. Terminated을 확인하고 있습니다. 청취자가 허용하고 CPU 사용량이 너무 높으면 Sleep (1)을 넣어 스레드 속도를 늦출 수 있지만 필요하지 않을 것입니다.

+5

기술적으로는 괜찮지 만 완전히 필요하지 않으므로 코드를 읽기가 더 어렵게 만듭니다. @David Heffernan이 지적했듯이 'True and not Terminated'는 'Not Terminated'와 같으며 두 번째 것은 읽기가 훨씬 쉽습니다. (비록 하찮고 쓸모 없지만 기술적으로 괜찮기 때문에 하향 투표하지 않습니다.) –

+1

예. '참'을 삭제할 수 있습니다. 내 대답은 스레드에있는 while 루프의 일반적인 사용에 관한 것이 었습니다.이 질문은 실제로이 질문에 관한 것입니다. – GolezTrol

+1

그리고 청취자 자체가 시간 초과를 참조하십시오. 그 스레드에 여분의 수면을 넣어 내 제안을 렌더링 불필요한. – GolezTrol

14

컴파일러에이 변환 : 당신이 그것을 완벽하게 자연 외모에 동의 거라고 확신이 방법을 작성

while not Terminated do 

. 이것은 매우 일반적인 관용구입니다.

관련 문제