2013-05-21 2 views
0

플로팅을위한 데이터 세트를 준비하는 pthread에서 작업을했습니다. 그런 다음이 데이터를 그래프와 같은 기본 창에 표시해야합니다. 어떻게 스레드에서 데이터 세트를 메인 윈도우에있는 렌더링 위젯으로 전송할 수 있습니까?멀티 스레딩을위한 슬롯 및 신호

슬롯과 신호를 사용합니다. 내 스레드가 슬롯에서 수신 할 수있는 신호보다 더 자주 신호를 내 보내면 어떻게됩니까?

문제는 하나의 스레드에서 다른 스레드로 데이터 집합을 전송할 때 QMap*을 사용한다는 것입니다. 그리고 슬롯이 그 작업을 마쳤다 고 확신해야하고 작업 스레드에서이 맵을 업데이트 할 수 있습니다.

+0

신호와 슬롯이있는 포인터를 사용해야하지 않습니다. 그냥 데이터의 현재 상태를 복사하십시오. – UmNyobe

+0

QMap에서 암시 적 공유를 사용하기 때문에 데이터를 복사 할 필요가 없습니다. http://qt-project.org/doc/qt-4.8/implicit-sharing.html – TheDarkKnight

+0

pthread를 사용하고 있으므로 수동으로 호출하고 있습니까? processEvents()는 주기적으로? 당신을 위해 이것을 호출하는 이벤트 루프가 없으므로 신호/슬롯이 그렇게하지 않고 pthread에서 나오지 않을 것입니다. – g19fanatic

답변

0

첫째, 당신은 pthread (posix 스레드에서와 같이)가 아니라 'QThread'에서 일한다는 것을 의미한다고 가정합니다. 이 경우 신호와 슬롯을 사용하여 데이터를 렌더링 용 메인 스레드로 전달할 수 있습니다.

'슬롯에 수신 할 수있는 빈도'가 얼마나 자주 발생합니까? 당신은 그것을 시도해 보았습니까? 당신은 문제가 있습니까, 아니면 당신이 잘못 생각한 것에 대해 추측 했습니까? 너무 많은 신호를 보내는 데 실제로 문제가있는 경우 처리 스레드의 데이터를 일괄 처리하고 타이머를 통해 주기적으로 일괄 처리를 보내십시오.

슬롯이 작업을 완료했는지 확인하려면 QMutex를 사용하여 각 스레드의 QMap에 대한 액세스를 제어 할 수 있습니다. QMutex의 Qt 도움말은 사용법을 명확하게 설명합니다. 뮤텍스를 잠그고 작업을 수행 한 다음 잠금을 해제하십시오.

+0

그는 아마 pthreads를 의미 ... – UmNyobe

+0

예, 나는 pthread 의미. – user14416

+0

설명해 주셔서 감사합니다. QThread를 사용하지 않는 특별한 이유가 있습니까? 별도의 라이브러리에서 실행됩니까? – TheDarkKnight