C#의 쓰레드(Thread)에서 UI 컨트롤 사용하기 (쓰레드에서 GUI 호출 문제)
C# / 2020. 10. 10. 23:25
쓰레드에서 GUI 컨트롤을 변경할 경우, 엑세스에러가 발생한다. 해결방법은 여러가지가 있으나, 여기서는 "변수와 타이머로 해결하는 방법", "FIFO를 이용한 방법"을 제시해본다. #변수와 타이머로 해결하는 방법 =============================== 쓰레드가 처리할 수 없는 GUI작업을 메인 GUI Form에서 처리하도록 부탁하는 것이다. 쓰레드에서는 호출할 동작에 대한 임시값을 변수에 설정하고, 해당 기능 호출용 변수값을 설정한다. 쓰레드에서는 호출할 동작에 대한 완료를 기다릴 필요가 있다면, 임시값이 클리어 되었는지 계속 대기한다. 예) MESSAGE_s="쓰레드에서 호출하는 내용"; MESSAGE_wait=true; while(MESSAGE_wait==true) { Thread.Sleep(50); } 타이머에서는 해당기능 호출용 변수값을 확인해서, 타이머를 일시 정지할 필요가 있다면, 정지시키고, 해당 GUI 기능을 동작하고, 동작완료가 되었음을 표시하기위해, 호출용 변수값을 조작한다. 타이머 재가동이 필요하면, 재가동한다. 예) private void Timer100msec_Tick(object sender, EventArgs e) { if(MESSAGE_wait==true) { Timer100msec.Stop(); GUI_MESSAGE(MESSAGE_s); MESSAGE_wait = false; Timer100msec.Start(); } else { } } 이 방법으로 메세지창등을 띄워서 작업할 수 도 있다. 변수를 몇개 더 추가해서, 결과값도 받을 수 있다. 코드 작성이 불편하긴하지만, 잘 동작한다. 문제점 : 빠르게, 연속으로, 다량의 작업을 처리하기에는 문제가 있다. 연동해야하는 GUI의 개수가 많아지면 관리가 어려워진다. #FIFO를 이용한 방법 =============================== 쓰레드에서 FIFO에 데이터를 넣고, GUI(메인)쓰레드에서 타이머에서 FIFO의 데이터를 받아서 처리한다. 마치 시리얼 통신데이터를 주고, 받는 방식이다. 쓰레드뿐만 아니라 네트워크로 확장도 가능하다. 장점 : - 많은, 자주, 복잡한 처리도 잘 처리가 된다. - 세밀하고, 다양한 처리가 가능하다. - 거의 모든 환경에서 사용가능하다. 단점 : - 정확한 시간 동기화가 필요한 경우에는 사용이 어렵다. - 작업이 완료될때까지 기다리기 어렵다. - 코드가 많아진다.
'C#' 카테고리의 다른 글
Form 사이즈 변경 (0) | 2020.10.10 |
---|---|
Form 편집창이 안뜨는 문제 (0) | 2020.10.10 |
packages' 요소가 선언되지 않았습니다 (0) | 2020.10.10 |
엑셀 패키지 관리자 설치 (0) | 2020.10.10 |
일관성 없는 액세스 가능성, 매개 변수 형식이 대리자보다 액세스하기 어렵습니다. (0) | 2020.10.10 |