쓰레드를 사용하다 의문사항이 있어 질문 드림니다.
쓰레드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번의 생성과종료를 했을 경우 쓰레기값이 들어 있는 공간이 없어지지않고
계속 남이 있다면.. 나중에 문제가 될 여지가 있는지
궁금합니다..
//
만족할 만한 답변을 얻으려고 여기저기 질문 올려놓고 있습니다.
도움 주시면 감사 하겠습니다.
그럼, 즐프 하세요 ~.
|