C# (WPF)으로 로또 번호 생성 프로그램을 만들어 보자 (5)
C# (WPF)으로 로또 번호 생성 프로그램을 만들어 보자 (5)
이전(이전포스트)엔 동행복권에서 제공하는 API 라고 하긴 좀 그렇지만 여튼 그걸로 회차를 입력해서 당첨 번호를 가져왔는데,
이번엔 회차 범위를 지정하고 그중 당첨번호만 따로 저장해놓고 몇번이 얼만큼 나왔는지 확인 해보려고 한다.
그리구 이 다음엔 그 번호들로 그래프를 그려봐야겠다.
점점 초보의 한계가 보이기 시작한다.... 그래도 공부니깐 Try 해야지.
늘 다른분들의 예제를 참고하여 진행 하는데.. 이번엔 진행하다가 backgroundworker에서 progressbar 의 수치를 변경하는 예제를 해보다가 안되서... 그냥 가라로 해버렸다.
나중에 더 테스트 해봐야겠다. ㅠㅠ
검색할 시작 회차와 끝 회차를 기입후 회차 검색 버튼을 눌르면 진행바가 진행되고, 완료가 되면 텍스트 박스에 각 번호별로 얼만큼 나왔는지 확인해 보자.private void button_Click(object sender, RoutedEventArgs e) { if ( (!string.IsNullOrEmpty(textBox_num.Text)) && (int.TryParse(textBox_num.Text,out _)) && (!string.IsNullOrEmpty(textBox_num2.Text)) && (int.TryParse(textBox_num2.Text, out _))) { button.IsEnabled = false; worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.DoWork += worker_dowork; worker.ProgressChanged += worker_progress; } else { textBox_json.Text = "제대로된 값을 입력하슈"; } }
일단 버튼 이벤트 메소드는 좀 수정을 했다. 각 회차 기입란에 공란 , 번호가 없으면 진행을 못하게 하고, 이상이 없으면 백그라운드 워커를 돌리는 걸로 했다.
진행중엔 버튼도 비활성화 시키자.
아 참고로 worker는 메인 윈도우 클래스의 도입 부분에 선언을 했다.
BackgroundWorker worker = null;
worker.ProgressChanged += worker_progress;
이녀석이 날 힘들게 했다.
이상하게 값이 바뀌어도 이벤트 핸들러는 진입 하는데 값이 안바뀐다.. ㅠㅠ
private void worker_dowork(object sender, DoWorkEventArgs e) { try { int iStartnum = 0; int iEndnum = 0; Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { iStartnum = int.Parse(textBox_num.Text); iEndnum = int.Parse(textBox_num2.Text); })); int iTotnum = iEndnum - iStartnum +1; int[] data = new int[46]; for (int i = iStartnum; i < iEndnum + 1; i++) { string strBuff = GetHttpString("https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=" + i.ToString()); if (strBuff == "") { Debug.WriteLine("no data " + i.ToString() + "회차"); } else { JObject obj = JObject.Parse(strBuff); if (obj["returnValue"].ToString() == "success") { data[(int)obj["drwtNo1"]] += 1; data[(int)obj["drwtNo2"]] += 1; data[(int)obj["drwtNo3"]] += 1; data[(int)obj["drwtNo4"]] += 1; data[(int)obj["drwtNo5"]] += 1; data[(int)obj["drwtNo6"]] += 1; } else { Debug.WriteLine("failed " + i.ToString() + "회차"); } } Debug.WriteLine(((float)i / iTotnum) * 100); Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { prog_bar.Value = (int)(((float)i / iTotnum) * 100); })); //worker.ReportProgress((int)((float)i/iTotnum)*100); Thread.Sleep(5); } string s = String.Join(", ", data); Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { textBox_json.Text = s; button.IsEnabled = true; })); } catch (Exception ex) { Debug.WriteLine (ex.ToString()); } } private void worker_progress(object sender, ProgressChangedEventArgs e) { try { Debug.WriteLine(e.ProgressPercentage); prog_bar.Value = e.ProgressPercentage; } catch (Exception ex) { Debug.WriteLine (ex.ToString()); } }
스레드 쪽 핸들러 부분들이다.
일단 스레드 내에서 ui 쪽 부분의 터치가 들어가면 에러가 난다.
그래서 ui 쪽 관련 된 부분들은 다 dispatcher.invoke 안으로 집어넣어 버렸다.
이래도 되나 싶지만, 우선 동작하고 구글링을 하면서 안좋은 점들을 점점 개선하는 방향으로 해야겠다.
그리고 검색한 번호들은 배열을 만들어서 그 번호의 배열에 +1 씩 해주기로 했다.
for 문으로 내가 검색할 만큼의 자료를 request 했으며, 너무 미친듯이 돌리면 어딘가 부하가 걸리거나 막혀버릴까봐 약간의 thread.sleep 을 추가했다.
헤헤 열받아서 worker.ReportProgress 를 주석 처리 해버리고 그냥 dispatcher.invoke 로 프로그레스바 값을 변경해 버렸다.
for 문이 종료 되면 일단 자료가 제대로 들어왔는지 textbox 로 뿌려줬다.
일단 배열을 for 문 돌리기 귀찮아 그냥 String.Join을 활용해 배열값을 뿌려줘 버렸다.
나온값중 첫번째 값은 0번 배열이라 그냥 무시하고, 나머지들을 보니 값이 제대로 나오고 있긴 한거 같다.
아래는 동작 영상이다.
일단 여기까지만 하고 그래프는 다음탄에 그려야 겠다.
5탄 끝
댓글
댓글 쓰기