C#.NET Q&A

BackgroundThread를 이용 중에 질문입니다. D.Dobob 평점: 없음 조회: 256
private void Start_Record_Click(object sender, RoutedEventArgs e)
        {
            BackgroundTest getFlag = new BackgroundTest(flag);
            if (flag != true)
            {
                Thread backgroundThread = new Thread(new ThreadStart(getFlag.breathSerial_DataReceived));
                backgroundThread.IsBackground = true;
 
                backgroundThread.Start();
                flag = true;
            }
            else
            {
                getFlag = new BackgroundTest(flag);
                getFlag.breathSerial_DataReceived();
                flag = false;
            }
 
        }
위의 부분은 MainWindow 클래스에서 버튼을 클릭 시 이벤트를 통해서 flag의 Bool 값을 받는 부분입니다.

아래 부분은 그러한 flag를 BackgroundTest클래스로 옮겨서 flag값을 받아오는 부분입니다.

public class BackgroundTest
    {
        bool flag_back ;
 
        public BackgroundTest(bool _flag)
        {
            this.flag_back = _flag;
        }
 
        public void breathSerial_DataReceived()//object sender, SerialDataReceivedEventArgs e
        {
           
                while (flag_back == false) // Start_Record_Click의 flag를 이용한 탈출
                {
                    var m_second = DateTime.Now.Millisecond;
                    var second = DateTime.Now.Second;
 
                    if (m_second % 500 == 0 && second % 5 == 0 && m_second != 0) //  두 번 진입 방지
                    {
                        //5초마다 새로운 wav파일로 바꿔서 녹음
                    }  
        }
    }

이렇게 구성을 하였는데, 제 생각에는 flag값을 받아오면 굵게 표시한 flag_back부분으로 _flag = ture값이 전달되어서
while문을 탈출해야할 것 같은데 막상 실행해보면 탈출을 못하더군요 제가 잘못쓰고있는 것 같은데, C#이나 객체 관련 언어를 배운 적 없이 당장 급해서 만드는 중이라서 이유를 잘 모르겠네요 혹시 질문이 잘 이해가 안되신다면 글 남겨주시면 다시 적어보겠습니다.
태그 : BackgroundThread C#,
작성자 정보
D.Dobob
Level 5
 [EXP.11/16]

메일:  비공개
글등록 +12 36 덧글등록 +3 15
자기소개
안녕하세요 다양한 언어를 해보고싶은 개발자입니다.
글 공유하기 |
  tweet facebook
2018-06-07 오후 6:26:47
나도한마디
사용자
스포너            [2018-06-08]
Level 22
 [EXP.45/50]
getFlag인스턴스를 버튼 클릭할 때 마다 생성하고 있습니다. 다른 인스턴스 이므로 flag도 다릅니다. 스레드에서 실행한 메소드의 flag를 변경하는 코그는 공유한 소스코드에서는 없습니다.

getFlag를 클래스 필드로 두고 생성 후 유지하도록 하십시요. 동일한 인스턴스에서 flag값을 체크하여 스레드에 넘긴 메소드의 flag를 변경하여 스레드가 멈추도록 하십시요
사용자
D.Dobob            [2018-06-08]
Level 5
 [EXP.11/16]
친절하고 정확한 답변감사드립니다. 말씀해주신대로 하니 문제가 어느정도 해결은 됐습니다. 다음은 수정한 코드입니다.
BackgroundTest getFlag = new BackgroundTest(false);


private void Start_Record_Click(object sender, RoutedEventArgs e)
{

if (flag != true)
{
getFlag = new BackgroundTest(flag);
Thread backgroundThread = new Thread(new
ThreadStart(getFlag.breathSerial_DataReceived));
backgroundThread.IsBackground = true;
backgroundThread.Start();
flag = true;
}
else
{
getFlag = new BackgroundTest(flag);
getFlag.breathSerial_DataReceived();
flag = false;
}

}
이렇게 진행하니 while문에서 브레이크를 걸어보니 탈출을 하긴 하더군요, 그런데 문제가 탈출을 했으면 breathSerial_DataReceived메소드가 종료될줄 알았는데 이상하게도 while문안으로 다시 바로 들어가버리더군요, while문에 전에 브레이크 포인트를 걸었음에도 그 부분에는 안걸리고 다시 while문 안으로 들어가 버립니다. 이건 또 무슨 문제인지 잘 모르겠습니다. 제가 객체지향언어 쪽에 아직 개념이 부족한지라 또 어떤부분에서 실수를 한 건지 잘 모르겠습니다...ㅠ
사용자
롬메달            [2018-06-08]
Level 51
 [EXP.84/250]
일단 브레이크 포인터 찍어서 하나씩 따라가보시는게 젛을것 같은데요.
그럼 왜 while문 탈출 못한지 나올거 같습니다
사용자
D.Dobob            [2018-06-08]
Level 5
 [EXP.11/16]
답변 감사드립니다. 브레이크 포인트를 찍어보았을 때 breathSerial_DataReceived 메소드로 진입은 하지만 왜 다른 class의 flag 값을 받아오지 못하는지 이해가 안되는 부분이어서 브레이크 포인트를 찍어도 잘 이해가 안됐는데 스포너님 답변에서 계속해서 인스턴스를 생성하는 거였더군요, 제가 아직 C#같은 객체지향언어에서 개념쪽이 많이 부족한 편이라서 이해를 못하고있었습니다 ^^;;
다시 한 번 관심가져주신 답변 감사드립니다.
태그로 엮인글
[C#.NET Q&A] Excel oledb이용해서 Insert 도중에 identity 자동증가 설정 도와주세요 ㅠㅠ[1]  방랑이z
[구인&교육정보] C# 솔루션 개발자를 모십니다.  luffy
[구인&교육정보] [정규직]개발자(C#, WPF, 백엔드, 프로트엔드) 모집 합니다.  (주)핸즈
[C#.NET Q&A] c# 콤보박스 안에 리스트가 모두 보이게 하고싶습니다.  노릇노릇
[WPF Q&A] Grid에서 페이징처리 궁금한점이 있습니다.[2]+2  방랑이z
[구인&교육정보] [금융 IT] KIOSK 개발자 모집  연민의굴레
[구인&교육정보] C#, BizActor(고급)모십니다  장자방
[C#.NET Q&A] hashtable에 들어가있는 데이터를 CSV파일이나 메모장으로 변환 가능한가요?[2]  시샵Wanted
[C#.NET Q&A] Visual Studio C#, 32feet.NET관련 질문드립니다.  D.Dobob
[C#.NET Q&A] 리스트뷰깜빡임을 아예 없애고 싶습니다.[2]+3  엘리엇
글리스트
Datagridview에 DataSource 변경문제 질문이요..[1]  야야얍
폼2에서 폼3의 listview 값 주기[1]  saki
엑셀 뷰어 질문 드립니다. 스프레드시트컨트롤[1]+2  하품하고파
C# 코드변환 확인부탁드립니다.[1]+9  훈닷넷
c# 이미지 캡쳐 프로그램 질문[1]  notorious
비주얼베이직에서 쓰던 for문인데 c#에서 알맞게 쓰드록 좀 도와주셔요 ㅠㅠ(프로그램입문3일째..)[1]  석유왕자
pictureBox 이미지 불러오기 ! [1]  문도
C#에서 C++ DLL 호출시 질문드립니다. 파일첨부 키모
Ring 저만 없나요? ( 이미지 첨부 )[1]+1  insurang
c# 이벤트 실행시 label text값 변경 질문이요 ! [3]+5  문도
 ★현재글->   BackgroundThread를 이용 중에 질문입니다.[2]+2  D.Dobob
IIS 파일 업로드 용량제한?  비베씨샾
버튼이미지 질문드립니다. [2]+1  제스
윈폼 단축키설정   비베씨샾
[C#] 메신저 프로그램 구현 시[1]+2  밍구
Microsoft Excel 14.0 Object Library 사용하려면 서버에 엑셀이 설치되어야 하나요?[1]+1  팔개
비동기식 통신에서 데이터 전송 관한 질문  Sad7Dayz
C# mybatis 질문있습니다.  매드포닷넷
C++dll C#에서 사용하는데 보호된 메모리 오류나는데 어떻게 해야하나요??ㅜ[1]  초보개발자
작업스케줄러대한 질문입니다.  jjin96
TCP사용도중 문제가 생겼습니다.. 도움을 주실분 계신가요? 파일첨부 Beoms