싱글 스레드 테스트 프로그램을 작성했는데
form_closing 이벤트가 발생할 때 threadstate.suspended 조건일 경우
abort() 메서드를 넣어줬습니다
실행을 하니까 스레드가 일시중지 상태일 때 폼이 닫히면 threadstateexception 예외가 발생해버립니다 도움말을 보니까 원래 abort메서드를 실행하면
threadstateexception 예외가 발생하는 것 같습니다.
abort 메서드가 좀 특이한것 같은데 예외없이 스레드를 종료할 수 있는 사용법 좀 부탁드리겠습니다
스레드가 죽지 않아서 프로세스를 작업관리자에서 계속 죽이고 있습니다
찾아보니까 IsBackground 속성을 true 로 설정하면 폼이 닫힐 때 모든 스레드가 소멸된다고하는데 이거 안쓰고 abort 메서드로 강제로 종료시킬 순 없나요?
다시 또 찾아보니까 제 코드에서 스레드 객체가 무한루프를 도는 메서드를 두번 이상 호출할 시에 스레드가 하나가 아니라 두개 세개 이렇게 된다고 적어놓은 글을 발견했습니다. 스레드는 하나만 만들었는데 메서드를 두번 세번 호출하는 것만으로도 실행되는 스레드가 늘어나게 되나요?
만약 그렇다면 당연히 클로징 이벤트에 걸어 놓은 abort 메서드는 제일 마지막 메서드에 대한 것만 종료시키겠군요 그래서 예외가 발생한 것이구요?
첫댓글 윽 맞군요 잡았습니다. 메서드가 호출될때마다 스레드가 실행되는 갯수가 늘어나는군요
그럼 이렇게 여려개의 스레드가 돌아갈 경우에 종료처리는 어떻게 하나요?
아 정말 abort 메서드로 여러 스레드를 종료시킬 수 없는 겁니까 아무도 답변이 ㅜ,ㅜ
Abort()는 ThreadAbortException을 발생시킵니다..
예외를 catch 하셔서 걍 비워두면 예외없는 것과 같을 터이고 거기에 Join()메서드를 쓰면 쓰레드가 끝나길 기다릴겁니다..
어떤 책에서 보니까.. 해시테이블에 생성되는 쓰레드를 모두 기록한다음 종료할때 쓰레드를 종료하더군요..
쓰레드를 쓰지 않고 어떻게 한꺼번에 하나의 쓰레드에서 두개의 무한루프를 돌릴수 있나요??
WaitHandle을 쓰면 특정쓰레드나 쓰레드 전체에 대해 쓰레드가 종료되는 시점에서 처리를 하실 수 있을듯합니다..
햐.. 실컷 이야기 해놓고 보니까.. vb네요.. 뭐 비슷하겠죠?? 전 C# 밖에 몰라요..흑..
작성해 주신 답변이 잘 이해가 안되네요 우선 돌아가는 스레드를 모두 구해서 종료해주는 건 당연한 거겠구요 방법은 모르겠습니다
스레드를 쓰지 않고 두개의 무한루프를 돌린게 아니라 스레드 개체는 하나입니다.. 버튼을 클릭하면 무한루프 돌면서 라벨에 값을 뿌려주고 스레드를 정지시키고 다시 버튼을 누르면 스레드를 resume 시킵니다.
제가 골머리를 앓고 있는 것은 이렇게 분명히 스레드 개체는 하나인데 동일한 메서드를 두번 세번 실행시키면 스레드 실행 갯수가 늘어난다고 어떤분이 그러시더군요
스레드 하나를 abort 시키면 당연히 종료가 됩니다 즉 버튼을 한번 눌르고 종료 시키면 당연히 프로세스도 종료가 됩니다
그런데 버튼을 누르고 스레드를 시작시키고 다시 버튼을 눌러 스레드를 일시 중단 시키고 폼을 닫으면 스레드가 모두 종료되지 않아 프로세스가 죽지 않더군요
멀티스레드는 제가 이문제 때문에 아직 멀티스레드의 종료처리까지는 공부를 안해서 님이 이야기 해주신 join이나 waithandle 에 대해서는 잘 모르겠습니다
데브피아에도 저같이 스레드를 강제종료 시키지 못해서 고민하는 글들이 많이 올라와있습니다만 거기에 대한 답변이 스레드를 강제종료 시키기엔 너무 미약하네요
c#이나 자바나 vb나 스레드는 거의 비슷한거 같습니다 전에 자바도 했었는데 자바는 이런문제가 없었던거 같은데... 아무튼 아직 해결하지 못해서 골치 썪고 있습니다
dim thread1 = new thread(addressof rulette.run) 이렇게 개체 하나만 생성 시켰는데 closing 이벤트가 발생하면 스레드가 종료되지 않고 살아있습니다.. ㅠ,ㅠ
혹시.. 지역변수로 선언하셨나요?? 그게 아니라면 쓰레드 하나를 죽이고 살리고 한다고해서 늘어날것 같지는 않은데.. 소스를 볼 수 있을까요?