2013-08-26 4 views
1

나는 여러 변경 사항을 서로 알리는 여러 Qt 개체를 가지고 있습니다.QT의 여러 연결 개체

세이프 가드없이 서로 연결하면 무한 루프의 신호가 생성됩니다. 오브젝트 A는 오브젝트 B와 C를 변경하고 신호를 보냅니다. B와 C는 각각 A와 C와 B에 신호를 되돌려 보낸다. 신호를 수신 할 때 일시적으로 다른 객체의 연결을 끊고 객체 종류를 거의 업데이트하지 않은 채 다시 연결하면 간신히 여러 종류의 신호로 인해 일시적인 충돌을 포함하는 "거의 종류"가 강조됩니다.

여러 Qt 객체를 안전하고 안정적으로 동기화하는 방법으로 무엇을 권하고 싶습니까?

+1

Qt의 '일반적인'방법은 모델이 공유 데이터를 보유하고 수정에 대한 응답으로 변경된보기를 알려주는 '모델보기'패턴입니다. – sje397

+0

필자의 경우 "모델"에는 GUI, Tcl 인터프리터 변수, C++ 코드에서로드 할 수있는 파일 등 여러 가지 인터페이스가 있습니다. 각 모델은 모델을 변경할 수 있습니다. 예를 들어, 텍스트 위젯은 모델 변경 소스 일 수 있으며 동시에 모델 매개 변수를 표시합니다. Tcl 변수는 사용자가 설정할 수 있으며 (그 당시 모델을 업데이트해야 함)이 변수에 의존하는 흐름에 의해 모델에서 업데이트 될 수 있습니다. – Michael

+1

그건 내게 꽤 평범한 것 같네, 마이클. MVC 패턴은 그런 종류의 물건을 구조화하려는 시도입니다. 모델에는 원하는만큼의 '뷰'가있을 수 있으며 모델의 모든 측면을 고려해야하는 것은 아닙니다. 모델에는 원하는만큼 수정 자 함수를 포함 할 수 있습니다. 요점은 모델이 변경되고 모델에서 알림이 전달된다는 것입니다. 따라서 윤곽을 그리는 원형 문제를 피할 수 있어야합니다. http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller – sje397

답변

0

QObject::blockSignalshere과 같이 사용할 수 있습니다. 그러나 QObject::blockSignals을 사용하면 QObject::blockSignalsfalse 매개 변수로 호출 할 때까지 모든 신호가 블로킹된다는 것을 기억해야합니다.

+0

글쎄, 나는 비슷한 것을 시도했다 : 신호 처리 절차의 상단에서 연결을 끊고 하단에서 연결한다. 질문에서 나는이 "간신히 일하는 것"이라고 언급했다. 증상 중 하나 : 천천히 버튼을 5 번 클릭하면 모든 것이 작동합니다. 신속하게 5 번 클릭하면 신호가 비정상적으로 발생하고 시스템이 충돌합니다. 차단으로 인해 disconnect-update-connect와 같은 재앙이 발생하는지 확신 할 수 없습니다. sje 1st에서 제안한 패턴을 시도 할 것입니다. – Michael

0

값이 실제로 변경 않으면이 같은 송신자 측과 같이 모두 수신 측에서 확인해야합니다 :

class A { 
    slot: 
     setValue(int a) { 
      if (a != m_a) { 
       m_a = a; 
       emit changed(); 
      } 
     } 
    private: 
     int m_a; 
} 

이 적어도,이 끝없는 원을 피해야한다.
물론 이러한 종류의 업데이트를 처리하는 데 MVC 패턴이 훨씬 더 좋습니다.