네이버 블로그의 멋진사람
WPF 는 기본적으로 MultiThread Program 이며, 각 스레드마다 객체에 대한 접근 권한이 설정되어 있다.
그래서 UIElement 의 경우 자신을 생성한 스레드를 기억해서 그 외의 스레드에선 접근할 수 없도록 하는 Thread Affinity 규칙을 지킨다.
이 때 UIElement 를 생성한 스레드를 UI Thead 라고 부르고, 이건 대체로 main thread 이기도 하다.
그렇지 않은 스레드를 Worker Thead 라고 부른다.
Key 입력 관련 message 나 데이터는 스레드 간 공유되지 않는 것 처럼 보인다.
다른 쓰레드에서 winapi 에서 쓰는 GetKeyboardState 를 호출하면 적절하게 실행이 되지 않기 때문이다.
이는 호출 전 Keyboard.IsKeyDown(Key.A) 같이 키보드 관련 C# 용 함수를 호출해주면 문제는 해결된다.
스택 오버플로우의 한 사람
또한 dispatcher 를 사용해도 해결된다.
스택 오버플로우의 다른사람
위의 두 삽질을 보면서 나는 의문점이 드는게, 키보드 관련 변수나 레지스트리는 어디에 있는건가이다.
dispatcher 를 사용하면 UI Thread 에서 실행이 되기 때문에, 적어도 UI Thread 에선 키보드 상태를 가져올 수 있다.
그런데 UI Thread 가 아닌 Worker Thread 에서도 특정 함수를 호출하면 키보드 상태를 가져올 수 있다.
그래서 스레드마다 키보드 관련 값을 저장하는건지 의문이 드는 것이다.
다만 내 삽질로는 답을 알 수 없었다.
한가지 중요한 것인 Dispatcher 가 UI Thread 에서 사용되고 그래서 다음과 같은 Timer 도 나온 것이란 것이다.
댓글 없음:
댓글 쓰기