FIFO, GUI 쓰레드 엑세스위반 다른 대안
C# / 2020. 10. 10. 23:38
쓰레드에서 GUI함수를 호출하면 (거의 대부분) 에러가 발생할 수 있다. 이럴때 Invoke등을 사용해서 처리하나, 여기서는 다른 방법을 제시해본다. 쓰레드가 처리해야할 함수의 파라메터값들을 GUI쓰레드로 보내고, GUI쓰레드의 타이머에서 처리하도록 하는것이다. 데이터 전달은 FIFO를 사용하고, FIFO의 데이터는 구조체를 사용했다.(범용성있게 수정이 필요하다. 예)인덱스 사용) 장점 : - Invoke등의 C#만의 특수한(?)것들을 사용하지 않아도 된다. - 매우 자주 호출할 경우, 동기화(Sync)등으로 느려질 수 있는 문제가 개선될 수 도 있다. 예) 100msec동안 수신된 데이터를 한번에 모두 처리하는 구조인 경우, 더 자연스러운 결과가 나올 수 있다. 단점 : - 소스코드가 늘어나고, - 실시간처리는 어렵고(보통 100msec지연) - 메모리 사용 아래 코드는 수정해서 FIFO로 사용이 가능하다. //구조체배열을 전역변수로 하고, 인덱스만 사용하는 방법이 좋을듯 싶다. public class FIFO_STRUCT { public enum TYPE { NULL,STR,INT,DOUBLE}; public struct Item { public string a,b,c,Str_Value; public int Int_Value; public double Double_Value; public TYPE type; }; Item[] item; int max_item_cnt; int r, w,cnt; bool bStop_wait; public FIFO_REPORT(int item_cnt=32) { max_item_cnt = item_cnt; reset(); } public void reset() { item = new Item[max_item_cnt]; r = 0; w = 0; cnt = 0; bStop_wait = true; } public int GetCnt() { return cnt; } bool Wait_empty() { while (cnt >= max_item_cnt) { Thread.Sleep(10); if (bStop_wait) { break; } else { } } return cnt < max_item_cnt; } void inc_w() { w++; if (w >= max_item_cnt) { w = 0; } else { } cnt++; } void inc_r() { r++; if (r >= max_item_cnt) { r = 0; } else { } cnt--; } public bool Pop(out Item out_item)//데이터가 없는 경우 false리턴 { bool ret = false; out_item = item[r]; if (cnt>0) { inc_r(); ret = true; } else { } return ret; } public void Push_wait(string a, string b, string c, string Str_Value) { if (Wait_empty()) { item[w].a = a; item[w].b = b; item[w].c = c; item[w].Str_Value = Str_Value; item[w].type = TYPE.STR; inc_w(); } else { } } public void Push_wait(string a, string b, string c, int Value) { if (Wait_empty()) { item[w].a = a; item[w].b = b; item[w].c = c; item[w].Int_Value = Value; item[w].type = TYPE.INT; inc_w(); } else { } } public void Push_wait(string a, string b, string c, double Value) { if (Wait_empty()) { item[w].a = a; item[w].b = b; item[w].c = c; item[w].Double_Value = Value; item[w].type = TYPE.DOUBLE; inc_w(); } else { } } }
'C#' 카테고리의 다른 글
ClassExcel (0) | 2020.10.10 |
---|---|
리스트뷰 헤더 컬럼들이 안보이는 경우 (0) | 2020.10.10 |
함수 포인터 전달 (0) | 2020.10.10 |
Form 사이즈 변경 (0) | 2020.10.10 |
Form 편집창이 안뜨는 문제 (0) | 2020.10.10 |