[c#] 동적으로 비주얼 컨트롤 만들기
여기에서 Controls는 this.Controls에서 Form1을 뜻하는 this를 생략한 거다. 마이크로소프트는 this에 대해 설명하기를 멤버들의 이름이 같아서 소속을 알기 애매한 경우에 특정 멤버를 한정하려면 이 키워드를 쓰라고 한다. 따라서 이걸 반대로 해석하면 다른 멤버와 이름이 헷갈릴 여지가 없어서 굳이 한정을 할 필요가 없을 땐 쓰지 않아도 된다. 바로 위와 같은 경우다.
[c#] 폼이 종료되었는지 확인하는 방법
폼이 종료되었는지 확인해야 할 때가 있다. 예를 들어 설정 창을 새로운 폼으로 만든 때 이 창은 하나만 떠야 한다. 설정 창을 두 개 이상 동시에 열리지 않게 하려면 이 창이 열려 있지 않을 때에만 창이 만들어지게 하면 된다. 근데 이게 약간 복잡하다. 아래와 같이 form이 visible한지 확인하려고 하면 오류로 멈춘다. 폼을 선언만 하고 인스턴스를 만들지는…
[c#] 크로스-스레드인데 예외로 처리되지 않는 경우
예전에는 멀티스레드를 구현할 할 때 Thread나 ThreadPool을 이용했지만 요샌 Task를 주로 쓴다. 이건 ThreadPool을 기본으로 하여 기능들이 추가된 거다. 마이크로소프트는 비동기 작업을 할 때 Task 이용을 권장하지만 이게 좋기만 한 거는 아니다. ThreadPool을 이용하면 예외로 처리되는데 Task로 하면 예외로 처리되지 않는 경우들이 있다. 이러면 크로스-스레드로 인해 엉뚱하게 작동을 해도 프로그래머는 모를 수 있다. 오류error와 예외exception는 프로그래밍을…
[c#] 크로스-스레드 예외 해결하기
lock 제일 간단한 방법이다. 그러나 디버그 빌드로 실행하면 오류로 처리되고 릴리스 빌드를 한 때에만 제대로 작동한다. 이는 Control.CheckForIllegalCrossThreadCalls 프라퍼티 때문인데 이게 디버그 빌드를 할 때에는 true가 기본 값이고 릴리스 빌드를 할 때에는 false가 기본 값이다. 실행이 되는지 여부가 중요한 게 아니라 제대로 된 결과가 나오느냐 하는 게 문제다. 비록 아래 예제는 간단하여 의도한 대로 실행이 되지만 lock을…
[c#] 크로스-스레드 예외란 무엇인가
어느 스레드에서 만들어진 객체는 원칙적으로 다른 스레드에서 수정할 수 없다. 두 개 이상의 스레드들에서 동시에 하나의 객체를 수정하도록 하면 하나의 작업이 마무리되기 전에 다른 작업이 덮어써 버리는 문제가 생긴다. 이런 상황이 되면 윈도우즈는 cross-thread 예외로 처리한다. 하나의 객체를 여러 스레드들에서 동시에 읽는 건 덮어쓰고 말고 할 게 없으니 상관없다. 주로 문제되는 상황은 윈도우즈의 비주얼 컨트롤을…
[c#] 차트 기본 예제
아래 코드는 선 차트를 그리는 예제 둘이다. 시리즈에 바로 바인드를 하는 것과 차트에 바인드를 하는 거다. 여기에서 바인드라는 개념은 DataTable 등을 DataGridView에 바인드하는 것과는 다르다. 데이터를 바꿔도 차트가 새로 그려지지는 않는다. 어떤 바인드 방법으로도 데이터가 바뀌면 차트를 새로 그려야 한다. y 값들만 만들었으므로 x 값은 자동으로 추가되게 해야 한다. IsXValueIndexed를 true로 하면 되는데 디자이너 창에서도…
[c#] 차트의 y축을 셋 이상으로 하기
하나의 ChartArea에는 최대 두 개씩의 x축들과 y축들이 제공된다. 각각 위와 아래, 왼쪽과 오른쪽에 위치하게 된다. 하지만 더 많이 필요할 때도 있다. 예를 들어 크기가 많이 다른 세 개의 시리즈들을 하나의 y축에 선 차트로 그리면 일부는 그저 수평선 비슷하게 나올 거다. 각 시리즈의 절대적인 값이 아닌 변화되는 정도를 세 개의 시리즈들 한꺼번에 비교하려 할 땐 각…
[c#] x축 데이터 없이 리스트로만 차트 그리기
차트 예제들을 찾아보면 하나 같이 x 값과 y 값을 만들어서 그린다. 그럴 필요 없이 간단하게 x 데이터 없이 List<int>만으로도 구현할 수 있다. 아래의 코드는 그냥 수직선으로 출력된다. x 값을 따로 설정하지 않아서 하나의 x 좌표 위에 겹쳐서 그려지니 그렇다. 굳이 루프를 돌려 별 의미 없이 단순히 증가하는 x 값을 만들기 위해 코드를 추가하지 않아도 된다….