2012-03-06 1 views
0

다른 스레드 (IO 스레드)의 정보가 필요한 GUI 스레드가 있습니다. IO 스레드는 직렬 포트에서 정보를 가져 오는 중입니다. Gui Thread의 모든 작업은 가져 오기 정보를 읽고 테이블에 표시하는 것입니다.C++에서 데이터를 공유하는 스레드

나는 IO 스레드가 뮤텍스로 보호 된 전역 구조체에 데이터를 넣어야한다고 생각했지만 GUI 스레드는 해당 구조체에서 읽어야합니다. 더 나은 구현이 있습니까? 이 경우 뮤텍스보다 중요한 섹션을 사용하겠습니까?

이제는 GUI 쓰레드를 사용하여 IO 데이터도 가져 오지 않는 이유에 대한 답변을 얻을 것이므로 멀티 스레딩이 필요하지 않습니다. 예, 저는 모범 사례를 배우기위한 간단한 예제를 제공하려고합니다.

고마워요!

답변

1

내가 제안하는 것은 같은 구조체의 두 개의 다른 인스턴스입니다. IO 스레드가 GUI 스레드를 업데이트 할 준비가되면 뮤텍스를 가져 와서 구조체를 GUI 스레드의 구조체에 복사하고 뮤텍스를 잠금 해제하며 구조체의 업데이트 된 복사본을 읽어야한다는 GUI 스레드에 알립니다.

중요한 섹션에서는 코드 섹션을 한 번에 하나씩 만 실행할 수 있다는 개념을 나타냅니다. 주로 그렇지 않으면 일관성없는 상태가 될 수 있기 때문입니다. 중요한 섹션을 만드는 방법은 잠금 뮤텍스와 잠금 해제 뮤텍스를 사용하여 섹션을 생성하는 것입니다.

+0

안녕하세요, 각각을 복사 할 때 어떤 이점이 있습니까? 하나는 자신의 구조체를 누른 다음 하나의 글로벌 하나를 공유하는 데, 나는 여전히 당신이 어떤 경우에 뮤텍스를 사용 언급 한 것입니까? 중요한 부분에 대해서는 뮤텍스가 항상 뮤텍스라고 생각했기 때문에 실제로 뮤텍스와 같은 OS에서 중요한 부분이라고 생각했습니다. 따라서 전체 애플리케이션을 공유합니다. – Kam

+0

아, 그리고 GUI 스레드에게 읽을 때이를 알릴 필요가있는 경우 구조체의 자체 복사본을 가지고 있다면, 그 구조체에 쓰지 않을 것이므로 뮤텍스가 필요하지 않습니다. – Kam

+0

글쎄, 당신은 여전히 ​​GUI 스레드 구조체에 IO 스레드 로컬에서 사본을 만들 때 뮤텍스가 필요하지만, GUI 스레드가 구조체로부터 임의의 시간에 읽는 것을 막는 뮤텍스는 필요하지 않을 것이다. 항상 일관된 상태가됩니다. 알림 후 10 초가 지나도 구조체를 업데이트하는 것이 안전하지 않을지라도 GUI가 읽기 여부를 확신 할 수 없습니다. 그래서 주위에 뮤텍스를 넣으십시오. 그러나 GUI 스레드가 읽을 수있는 시간은 아주 작습니다. –

2

한 가지 방법은 IO 스레드가 입력 데이터를 GUI에 게시하도록하는 것입니다. IO 스레드에서 데이터를받을 때마다 힙의 struct에 패키지를 만들고 구조체 주소와 함께 사용자 지정 메시지를 GUI 스레드에 게시합니다. IOW를 사용하여 GUI 스레드를 만든 다음 IO 스레드가 GUI 스레드의 핸들을 IO 스레드에 전달하여 GUI로 데이터를 다시 보내는 데 사용합니다. 그렇게하면 mutex/critical 섹션을 신경 쓰지 않아도되지만 기존 GUI 메시지 대기열을 사용하거나 프로젝트가 실행되는 환경에 따라 직접 만들 수 있습니다.

+0

+1 일반 GUI 스레드에서 메시지를 사용하여 버퍼 인스턴스/구조체를 대기열에 넣습니다. 입력 대기열. –

관련 문제