장성호 님이 쓰신 글 :
: @ 답변1
:
: * Signal을 보내는데 시간이 많이 걸린다면?
: signal보내는 함수를 쓰레드에서 바로 직접실행하는 방법은 적당하지 않을수 있을것 같네요
:
: * Count는 정확하게 계속증가시켜줘야하지만..
: Signal을 보내는것 약간의 오차가 허용된다면(수~수십ms) PostMessage도 괜찮은 방법이 될것 같습니다.
: (Syncronize 는 동작하는 쓰레드가 처리끝날때 까지 기다리는 좋은방법은 아닌듯 하구..)
:
: * Signal을 보내는데 시간이 많이 걸려
: Thread에서 직접 Signal보내는 함수 호출이 부담스럽구..
: 또 비교적 정확하게 보내야 한다면?
: Signal만 보내는 쓰레드를 따로 만들어서 Event(SetEvent)로 동기화 시키는것이 좋을듯 합니다.
:
:
: @ 답변2
: * 객체는 당연히 Free해줘야 합니다.
: 변수가 nil인것과는 전혀 상관없죠
:
: * 쓰레드 객체를 free하는 방법에
: - 직접 free를 호출할수도 있지만...
: - TThread에는 FreeOnTerminated라는 프로퍼티가 있습니다.
: 이놈을 true로 설정해주면 Thread가 종료될때 알아서 객체를 free해줍니다.
:
: treminated->WaitFor->free 이런 순으로 할때는..
: thread상태에 따라서 한참을 Wait해야할수도 있을것입니다.
:
:
: 그럼..
:
:
:
: wanna 님이 쓰신 글 :
: : 쓰레드를 사용하다 의문사항이 있어 질문 드림니다.
: :
: : 쓰레드1을 통해.. 어떠한 조건이 맞으면 메인에 있는 프로시져를 실행시키려 합니다.
: :
: : 프로그램 동작은
: : 고속카운트를 쓰레드로 처리 하고
: : 특정 카운트가 되면 i/o 신호를 장비에 보내려고 하고 있습니다.
: : 가령 한번에 만번의 카운트 이벤트가 발생할때
: : 100, 300, 600, 700 , 1000 카운트가 되면 장비에 신호를 보내려고 합니다.
: :
: : while not terminated then
: : if waitforSingObject(EncEvent, 100) = 오브젝트 then begin //
: : inc(EncCount)
: : if EncCount = 100 then frmMain.SignalOn1; //메인 프로시져
: : if EncCount = 300 then frmMain.SignalOn2;
: : ..
: : if EncCount = 1000 then frmMain.SignalOn5;
: : end;
: : end;
: :
: : 대략 현재 이렇게 구현을 하였습니다.
: :
: : 메인에 있는 프로시져를 실행시키려 하는 방법으로
: : 1, 쓰레드1에서 Postmessage 를 메인쪽으로 던져준다.
: : 2. 메인에 있는 프로시져를 직접 실행시킨다.
: : 3. 메인에 있는로직을 쓰레드2로 만들어 쓰레드1에서 Setevent 해주어 쓰레드2에서
: : 로직이 실행토록 만든다.
: : 이정도 방법이 있을 것 같은데.. 각각의 상황에 따라 다르겠지만..
: :
: : 어떠한 방법이 좋은 방법인지 위의 1,2,3 방법의 차이점이 어떤 점인지 잘 모르겠네요.
: : 고수님의 시원한 답변 부탁 드림니다.
: : //
: : 메인 프로시져 내용은 vcl 을 컨트롤 하는것이 아니라. 장비에 신호만 주는 로직이라.
: : 싱크로나이즈는 사용안했습니다.
: : 싱크로나이즈를 사용 하면.. 동기화 처리가 되어, EncCount 를 놓칠것 같아서요.. (맞는지 몰겠슴당 ㅡ.ㅡ; )
: : 메인에 있는 프로시져가 동작 하는 도중에도 카운트 처리는 inc(EncCount)}
: : 계속 해야 되거든요..
: : //
: :
: :
: :
: : 질문2.
: :
: : 스레드 생성, 실행시
: : 버튼 1 클릭
: : {
: : Create(true)
: : resume
: : }
: : 을 사용하고,
: :
: : 종료시
: : 버튼 2 클릭
: : {
: : Terminate
: : waitfor
: : }
: : 를 사용해 왔습니다.
: :
: : 이때 갑자기 든 의문하나..
: :
: : 쓰레드는 동작을 종료 하였으나, 인스턴스 생성이 종료(?)가 되지 않은것 아닌가.
: :
: : 그래서. 버튼3 에서.
: :
: : if not (쓰레드 = nil) then begin
: : Showmessage('not nil');
: : end;
: : 이렇게 하니 역시나 쓰레드 인스턴스가 종료가 되지 않아 쇼메시지가 나오네요.
: : 물론. 종료를
: : {
: : terminate
: : waitfor
: : free
: : nil
: : }
: : 까지 하니 쑈메시지는 나오지 않더군요.
: :
: : 어쨌든.. 버튼1 과 버튼2 을 계속 사용할때
: :
: : create 한 인스턴스는 계속 증가하는 것이 아닌지,
: : 아님 한번생성된 인스턴스를 계속 재 사용하는 것인지 궁금함니다.
: :
: : 인스턴스 생성이 계속 증가한다면.. 메모리 문제가 발생하지 않을까 해서.
: : 초보적인 질문 올림니다. (결국은 인스턴스 생성에 관한 질문이네용 ㅡ.ㅡ;)
: :
: : //델마당에서의 답변은 free 했을시.. 메모리 공간이 nil 로 바뀌는 것이 아니라. 쓰레기 값들이
: : 남아있게 된다는데..
: : 그럼, 명시적으로 nil 을 사용해주어야 하는 것 아닌가 해서 질문 드림니다.
: : 100번의 생성과종료를 했을 경우 쓰레기값이 들어 있는 공간이 없어지지않고
: : 계속 남이 있다면.. 나중에 문제가 될 여지가 있는지
: : 궁금합니다..
: : //
: : 만족할 만한 답변을 얻으려고 여기저기 질문 올려놓고 있습니다.
: : 도움 주시면 감사 하겠습니다.
: :
: : 그럼, 즐프 하세요 ~.
|