Q&A

  • [질문]폼 이 얼어 버리는 현상..
쓰레드로  일정시간 마다 이벤트를 받아.  특정 값을 비교하는 검사 로직을 구현 중입니다.

검사로직 부분에서 카운터 비교가 틀리면 알람을 발생시키고,
메인폼에 버튼을 두어 알람 해제기능을 합니다 .

근데..프로그램이 초반에 잘 돌다가.. 검사쪽에서 알람을 발생 시키는데 10분 정도 되면 메인폼의 버튼을 클릭하면 먹통이 되는 현상이 발생되네요.. ㅡ.ㅡ;  

폼에서 아예 버튼이벤트를 처리 못하는 것 같기도 하고, 버튼이 아예 동작을 한하는 건 같습니다.
정확한 원인을 찾기가 힘드네요.
고수님들의 도움 부탁 드림니다. ..

--- 메인폼 -

procedure TfrmMain.tmrChkTimer(Sender: TObject); //검사 타이머.
var
   errCode : integer;
begin

   tmrChk.Enabled := false;

   if (a - c) < b then begin
       알람 발생.
       memo1.lines.add('카운터 오류입니다.');
   end;
   c := a
end;

procedure TfrmMain.btnAlarmClearClick(Sender: TObject); //알람해제 버튼.
begin
   application.ProcessMessages;
   알람해제.
end;


-- 쓰레드 Unit ----


procedure TSensorThread.Execute;
begin
  oldT := GetTickCount;
  while(not Terminated)do
  begin
    if WaitForSingleObject(irEvent[0], 500) = WAIT_OBJECT_0 then
    begin//10 초 마다 이벤트 발생.
      

        frmMain.memo1.Lines.Add('Press : ' + inttostr(sscount));
        frmMain.tmrChk.Enabled := true; // 500ms 뒤에 검사
        sscount := sscount + 1;
    end;
  end;
end;


2  COMMENTS
  • Profile
    최용일 2010.05.19 23:12
    쓰레드에서 사용한 VCL컴포넌트(memo1, tmrChk) 때문입니다.
    쓰레드에서 VCL을 쓰실려면 쓰레드의 Synchronize메소드를 이용해서 사용하세요.
  • Profile
    유준호 2010.05.19 23:54
    관심 가져주셔서 감사합니다. ..

    sync.. 했는데.. 여전히 폼이 얼어 버리네요.. ㅡ.ㅡ;

    근데. Syncronize로 호출 할때.. 그래픽 객체만 해당 하지 않나요 ?
    타이머 도 싱크로 안에 넣어야 하는지요 ?

    또. 위와 같이 일정시간 있다 체크 하려 할때,
    체크 로직을 쓰레드 안에 두려면 Delay 사용 하는 방법 외에
    다른 방법이 있는지요 ?