|
제가 볼때는.....
그냥 PostMessage() 함수로 데이터를 쏘실거라면 굳이 동기화는 필요 없을것 같습니다
어차피 해당되는 UI Form에서 이벤트 핸들러가 처리할테니까 말이죠
UI 동기화는 UI Form의 컨트롤을 직접 쓰레드에서 조작할 때 사용합니다
그래서 VCL Thread 클래스에서는 Syncronize라는 동기화 함수를 제공 하기도 하구요
그런데 제가 해보니 Syncronize() 동기화 메쏘드는 문제가 좀 있습니다
여러 쓰레드가 대량으로 데이터를 발생 시키고 그걸 UI Form에 반영시키려다 보면 Form이 행에 걸립니다
쓰레드 없이 직접 Form을 연속해서 업데이트 할때처럼 말이죠
VCL Syncronize 메쏘드는 다수의 쓰레드가 비정기적으로 업데이트를 할때 쓰라고
있는가보다 생각하고 있습니다
저의 경우는........
UI Form에서 1초정도나 그 이하로 타이머를 할당하고
구조체 변수를 해당 쓰레드로 넘겨서 발생 데이터를 반영하도록 하고 있습니다
이경우 구조체에 대한 접근은 CriticalSession 등으로 동기화 시키고요
PostMessage() 함수와 같이 윈도우메세지 기반의 UI Form 변경방식은
지나치게 멀리 돌아가는 경향이 있고 역시 대량 데이터 발생의 경우는 성능저하의 문제도 있습니다.
그리하여 타이머를 통해서 업데이트를 하고 있습니다
도움이 되셨길 바랍니다~
초보 개발자 님이 쓰신 글 :
: 안녕하세요? 궁금한게 있어서 질문올립니다.
: WIN32 환경에서 멀티쓰레드로 구조로 작성할때,
: 각 쓰레드 컨텍스트에서 UI 를 생성한 쓰레드로 메시지를 보내려 한다면,
: 보통 PostMessage 등을 사용하는데,
: 이때 크리티컬 섹션등을 사용한 동기화 코드가 필요한가요?
: 여지껏 메시지 큐가 동기화를 시켜준다고 생각하고,
: 동기화 코드를 작성하지 않았는데(COM에서도 각 쓰레드에서 접근을 동기화 시킬때 메시지 큐를 이용하는데..),
: 우연히 다음 책을 살펴보는중 의문이 드네요.
:
: "IT COOKBOOK 윈도우 네트워크 프로그래밍 : TCP/IP 소켓 프로그래밍"
:
: 위책의 내용중에, 자세한 부분은 기억이 안나는데(서점에서 대충 서서 읽어서..ㅡㅡ...)
: 멀티쓰레드 서버 예제 코드중에, UI를 가진 쓰레드로 메시지를 보낼때 동기화 코드를
: 작성하네요. UI 코드에서 메시지 핸들러가 동기화가 필요한 자원에 접근한다면 이해가 가는데,
: 그 내용은 그런것도 아니거든요.
:
: 제가 무언가 착각한건가요??
|