본문 바로가기

전체 글360

garbage collect의 함정 아래 코드는 File object를 만든 후 콜백을 추가한 다음, Length가 Load되면 콜백 함수에서 Items에 file을 추가하는 코드이다. public void Add(string file) { File fileItem = new File(file); fileItem.LengthLoaded += FileItem_LengthLoaded; } private void FileItem_LengthLoaded(File file) { Items.Add(file); } 논리상으로는 아무런 문제가 없다. Length가 load되는 코드에 문제가 있지 않는 이상은 Add가 호출된 횟수만큼 FileItem_LengthLoaded도 호출될 것이다. 하지만 직접 실행시켜보면 예상치 못한 결과가 나온다. Add가 호.. 2023. 3. 25.
WasapiLoopbackCapture와 Silence WasapiLoopbackCapture는 시스템 사운드를 녹음할 때 쓰는 클래스다. 근데 아무 소리도 안 나면 녹음을 안 한다. 즉 소리에 공백이 생기는 걸 허용하지 않는다. 1초 동안 소리 내고 10초 쉰 다음 1초 동안 소리 내면 파일에는 2초 길이의 소리만 저장된다는 소리다. 특수한 경우가 아닌 이상 이런 결과물을 원하는 프로그래머는 없을 것이다. 그에 대한 가장 간단한 해결 방안은 Silence를 play시켜서 소리의 공백에도 계속 파일에 소리가 기록되게끔 하는 장치를 만드는 거다. // 예시 waveIn = new WasapiLoopbackCapture(recordingDevice); waveIn.DataAvailable += OnDataAvailable; waveIn.RecordingStopp.. 2023. 3. 23.
메모장의 숨겨진 기능 (3) 컨트롤 키랑 쉬프트 키 같이 누른 상태에서 백스페이스 누르면 커서 앞에 있는 줄이 모두 사라진다. 참고로 Ctrl+Shift+Del은 커서 뒤에 있는 줄 지운다. 2023. 3. 22.
개발자와 사용자의 관점 차이 개발자는 메모리와 cpu 사용량을 신경 쓴다. 유저는 그딴 거 신경 안 쓴다. 개발자는 그래서 불행하다. 2023. 3. 14.
MultiBinding 간단한 예제 Binding을 하다보면 단일 parameter가 아닌 복수 parameter를 사용해야 할 때가 있다. wpf는 이를 위해 MultiBinding이라는 것을 구현해 놓았다. 아래는 두 TextBox의 문자열을 더하는 프로그램의 예제이다. MultiBinding은 반드시 Converter가 필요하다. parameter가 2개 이상이면 이걸로 도대체 뭘 어쩌라는건지 컴퓨터 입장에서는 모르기 때문이다.(물론 단일 Binding도 필요하다면 Converter를 추가할 수 있다.) Class1.cs using System; using System.Globalization; using System.Windows.Data; namespace IamNamespace { internal class Class1 : IM.. 2023. 3. 11.
인생은 살기 힘들다는데 코드가 어렵게 짜지는 것은 당연한 일이다. 2023. 3. 8.
Thread에서 변수 사용 주의 for(int i = 0; i 0) { int a = i; Dispatcher.BeginInvoke(new ThreadStart(() => { polygon.Points.Add(new System.Windows.Point(a, contrastArray[a])); })); } } 왜 int a라는 변수를 만들었을까? thread 안에서 i를 참조하면 당연히 BeginInvoke가 호출되었을 때의 i값을 가져올 것 같지만... 그렇지 않다. Invoke 시점의 i를 가져오게 된다. 그래서 Invoke가 조금이라도 늦는 순간 i = contrastArray.Length일 때 함수가 호출되어서 오류가 나게 된다. i.. 2023. 3. 4.
OneWay와 TwoWay 바인딩을 하면 Window의 Width를 줄여서 TextBox의 Text를 바꾸거나, 그 역이 가능하다. 그러나 일방향으로만 Binding이 되도록 만들고 싶을 수 있다. Mode=OneWay를 추가하면, Window의 크기를 늘리거나 줄일 때만 TextBox의 값이 변한다. TextBox의 값을 수정한다고 Window의 Width가 변하진 않는다. 즉 Window -> TextBox 방향이다. OneWay를 OneWayToSource로 바꾸면 OneWay의 역일방향이 된다. 즉 TextBox -> Window 방향이다. Source는 당연히 Window를 의미한다. 2023. 3. 1.
Binding - UpdateSourceTrigger xaml을 보면 Window의 Title에 TextBox의 Text를 바인딩함으로써, 텍스트 박스에 글자를 입력하면 실시간으로 윈도우의 제목이 바뀔 것처럼 보인다. 하지만 실제로 실행시켜보면... 글자를 아무리 써도 제목이 비어 있는 상태다. 이는 UpdateSourceTrigger가 TextBox의 Focus를 잃을 때로 되어있기 때문이다. ​ UpdateSourceTrigger=PropertyChanged를 추가해주면 속성이 바뀔 때마다 Update를 해서 글자를 입력함과 동시에 제목이 바뀌는 것을 볼 수 있다. 2023. 3. 1.
RelativeSource Binding RelativeSource를 이용하면 c# 코드 없이 순수 xaml로만 바인딩을 할 수 있다. 실행 결과는 아래와 같다. 보다시피 Window의 ActualWidth가 Label의 Content에 바인딩이 됐다. 2023. 3. 1.