프로그램이 메모리에서 해제가 안되는데 왜일까요?
현재 인디 소켓을 사용하여 클라이언트를 서버소켓에 물렸습니다. 그리고 클라이언트 프로그램을 종료시키면 클라이언트 프로그램이 메모리에 살아있습니다. 그리고 cpu를 99나 먹고 혼자 난리를 피웁니다. 왜인가요?
클라이언트 프로그램에서 Tlist를 전역변수로 사용하고 있구, 객체를 new를 사용해 추가하고 있습니다. 그리고 Thread를 돌리고 있습니다.(클라이언트 소켓이 계속적으로 송수신하기위해서)
프로그램 종료시에 list.free와 thread.terminate시켰습니다.
아무리 생각해도 indy client socket이 물고 있든가 ..아님 쓰레딩이 물고 있는거 같은데 어떻게 다른방법으로 처리하는방버없나요?
고수님들의 조언부탁드립니다.
쓰레드를 사용할때는 동기화를 맞춰야합니다. 그리고 만약, 쓰레드 안에서 ShowMessage()함수나 다른 폼과의 연결을 할때는 TThread.Syncronize()함수를 이용해야만 합니다. 그렇지 않고, 쓰레드내어서 ShowMessage()함수를 사용하게 되면, 프로그램이 죽거나 오류가 발생합니다.
또한가지 가능성은 TList를 사용한다고 하신거 같은데, 두개 이상의 쓰레드에서 하나의 변수를 공유해서 서로 '읽기' 또는 '쓰기' 작업을 하게되면, 문제가 발생할 수 있습니다.
이런 경우 크리티컬섹션이나 뮤텍스를 이용해서 동기화를 맞춰줘야합니다. 특히, string 변수를 두개의 쓰레드가 같이 읽거나 쓰면 오류가 발생해서 그 쓰레드가 종료되지 않고 계속 메모리에 남아있을 수 있습니다.
쓰레드에 관해서 자세히 모르시면, 될수있는데로 쓰지 마세요! 꼭 써야한다면, 쓰레드에 관해서 자세히 공부하신 후에 사용하세요.
이책에 관련된 내용이 다른 책들에 비해서 잘나와있습니다.
'Delphi in a nutshell'이라는 책을 참고하세요.
아님 소스를 보내주세요...