Q&A

  • 스레드가 종료되어있는지 검사?
어떤 일을 처리할때 thread를 쓰고 바로 종료하고 그렇게
프로그램을 짰거든요.
procedure TfMainToolBar.ReceiveEven;
var
    MergeThread1 : MergeThread;
begin
      if MergeThread1.
      MergeThread1 := MergeThread.Create(MergeQuery,            MergeGrid1,ZPgSqlDatabase1,ZPgSqlTransact2);
      MergeThread1.OnTerminate := lastThread;
end;
이렇게 했는데 thread가 종료되자 않는 사이에 다시 이 프로시져가 실행되면
에러가 뜨네요.

이 스레드가 실행하고 있는지 종료되어있는지 검사해서 스레드가 실행중이면
이 스레드를 좀 기다렸다가 실행하고 종료되어있으면 바로 스레드를 실행 기켰으면 합니다.어떻게 처리해야할지 모르겠네요. 고수님들 답변 부탁해요
2  COMMENTS
  • Profile
    조학수 2002.07.09 00:07
    아래의 님께서 쓰신것 처럼 공통 변수를 써서 해결을 하실 수 있을 것입니다.

    다음과 같은 방법을 제안합니다.

    1. 일반적으로 Process가 동시에 두개 뜨지 않도로 할 때 사용하는 방법으로서 Named Mutex(Mutual Exclusion)을 이용하여 Thread의 Execute의
    초반에 Mutex를 Create하고나서 GetLastError를 이요하여 혹시 이전에
    Create 되어 있었는지 확인하여 Thread가 돌고 있는지 확인 합니다.

    더 자세한 사항은 한 Process가 동시에 두번 돌지 않도록 하는 방법에 대해서
    찾아 보시면 해답이 있을 것입니다.


  • Profile
    이추형 2002.07.08 21:27
    오호, 어렵네요...
    저두 구현하려 했지만 Thread를 검사할수있는 방법이 없더라고요
    따라서 Thread내에 Flag를 check하는 루틴을 두어 중복 실행을 방지
    하였습니다.

    // *. Thread FreeOnTerminate의 설정값에 대한 도움말
    // Set FreeOnTerminate to True if you don뭪 want to explicitly destroy //
    // threads after they finish executing. //
      try
        // 추출규칙TABLE감시 및 작업생성Thread실행
        vthExtractRuleCheck := TthExtractRuleCheck.Create (True);
        vthExtractRuleCheck.Priority := tpLowest;
        vthExtractRuleCheck.FreeOnTerminate := True;
        vthExtractRuleCheck.Resume;
      except
        //
      end;