본문 바로가기

Coding Diary/C,C++,C#

Thread 작성 시 고려 사항 및 오류 사항 : 스레드가 실행 중이거나 종료되었습니다. 다시 시작할 수 없습니다.

개인적으로 프로그램을 현업에서 만들면서 C#의 장점을 들면 스레드를 첫번째로 떠올리곤 한다

 

기계제어와 스마트 팩토링 분야에서 일하고 있다보니 백그라운드에서 바이패스나 로깅을 기능을 중점으로 둔 프로그램을 자주 만들곤 한다.

 

현재 쓰고 있는 언어는 Delphi와 C#을 번갈아 가면서 쓰면서 스레드 기능이 사용하기 어려운 Delphi는 타이머로 대체해서 쓰곤 한다. 일정한 시간 주기로 작업 진행할 수는 없지만 소켓 서버나 패킷등의 바이트 값들을 저장하기에는 더없이 편할 수가 없다 메인 스레드에 크게 영향이 없어 쓰기가 편하다.

 

스레드를 사용하면서 오류 사항 및 해결 방법들을 노트 겸 올려 놓고자 한다.

        private void psThreading1()
        {
            while (fConnection)
            {
                fCnt++;
                Thread.Sleep(1000);
            }

            MessageBox.Show(fCnt.ToString());
            fCnt = 0;

        }

위와 같이 스레드 함수를 작성해 놓았다 특정 이벤트 시 fConnection 변수를 false로 변경하면서 지금까지 카운팅 된 fCnt 값을 메세지 박스에 표시 되게 끔 했다 .

 

4초 정도가 지난 후 스레드의 소멸 여부를 확인하기 위해서 labe1을 클릭을 하면 재 실행이 되게끔 했지만 오류가 난다

오류의 내용:

스레드가 실행 중이거나 종료되었습니다. 다시 시작할 수 없습니다.

 

 

그렇기 때문에 스레드를 NULL로 초기화 한 후 재생성을 해야 스레드 실행이 가능하다

수정 코드 :

        private void label1_Click(object sender, EventArgs e)
        {
            fConnection = true;
            fCheck_th = null;
            fCheck_th = new Thread(new ThreadStart(psThreading1));         
            fCheck_th.Start();
                    
        }

위와 같이 스레드를 초기화 한 후에야 실행을 하면 오류도 없고 메모리의 lick 현상도 없다

메모리 누수는 항상 프로그램을 만든 다음 확인이 필요하다.(이걸로 많이 혼났음....) 

그리고 스레드는 저절로 종료 되게끔  프로그램을 작성하는 것이 좋다(절대로 abort쓰지 말 것!!)