QT 메타 개체 시스템 (메타 객체) (III), 그 이유는 Moc위한 신호 QT 슬롯

왜 Qt는 신호와 슬롯 MOC 것?

  템플릿은 컴파일러가 전달 된 매개 변수의 유형에 따라 동적으로 코드를 생성 할 수 있습니다 C ++ 장치에 내장되어 있습니다. 사람들이 템플릿 프레임 워크는 매우 흥미 만들 그러므로, 우리는 Qt는의 많은 지역에서 고급 템플릿을 사용합니다. 쉽게 특정 콘텐츠를 표현하는 템플릿을 사용할 수 있지만 일부 콘텐츠는 템플릿으로 표현 될 수 없습니다 그러나, 몇 가지 제한 사항이 있습니다. 일반 컨테이너 클래스 벡터 포인터 형 부분 특수화 필요하더라도, 쉽게 표시하고, 주어진 문자열 XML 기반의 그래픽 사용자 인터페이스를 제공하는 기능에 대한 설명은 템플릿을 나타내는 데 사용될 수 없다. 그리고 그들 사이의 회색 지대이다. 당신은 코드 크기, 가독성, 휴대 성, 가용성, 확장 성, 견고성, 최종 디자인 미학을 희생 물론, 몇 가지를 수정하는 템플릿을 사용할 수 있습니다. 템플릿 및 C 프리 프로세서는 놀라운 지성과 놀라운 효과를 직접 체험 할 수 있도록 확장 할 수 있습니다. 이 일을 수행 할 수 있습니다해서, 그것은 반드시 그들이 올바른 설계 선택이다 의미하지 않는다. 불행하게도,이 코드는 책에 게시 할 것이 아니라, 실제 컴파일러의 사용은 현실 세계의 운영 체제에 컴파일.
여기에 Qt의 MOC를 사용하는 몇 가지 이유가 있습니다 :

문법의 중요성

  문법은 사탕되지 않습니다 : 우리의 알고리즘을 표현하는 데 사용되는 구문은 크게 코드의 가독성과 유지 보수에 영향을 줄 수 있습니다. Qt는 신호와 슬롯의 구문은 실제로 매우 성공적으로 입증했다. 직관적 인 사용하기 쉽고 읽기 쉬운 구문. 이 추상과 보편성의 높은 수준에도 불구하고 - Qt는 연구는 그들을 도울 사람들이 문법과 사용 신호와 슬롯을 이해하는 것을 발견했다. 이것도 디자인 패턴을 고려하지 않고, 처음부터 프로그래머가 설계하는 방법을 알고 있습니다.

좋은 사용하는 코드 생성기

  Qt의 MOC (MOC)를 초월 언어 능력을 컴파일하는 간단한 방법을 제공합니다. 이것은 C ++ 컴파일러 추가 C ++ 코드에서 컴파일 된 표준을 생성함으로써 달성 될 수있다. MOC는 C ++ 소스 파일을 읽습니다. 이 클래스 선언을 포함하는 하나 이상의 매크로 Q_OBJECT를 발견하면 클래스 메타 오브젝트 코드를 포함하는 다른 C ++ 소스 파일을 생성합니다. MOC C ++ 소스 파일을 생성하는 컴파일 및 클래스의 실현과 연결 (또는 클래스 소스 파일을 #include하는 수 있음)해야합니다. 일반적으로 수동으로 호출하는 것보다 MOC하지만, 프로그래머가 추가 작업이 필요하지 않도록, 빌드 시스템에 의해 자동으로 호출.
  MOC는 코드 생성기 Qt는의 유일한 사용하지 않습니다. 다른 두드러진 예는 UIC (UI 컴파일러)이다. 그것은 XML 사용자 인터페이스 기술 정보에 기억하고, 인터페이스를 설정하기위한 C ++ 코드를 생성 받아 들인다. 또한 Qt는에서, 코드 생성기는 또한 일반적이다. RPC 및 IDL 예에, 그것은 프로세스 또는 컴퓨터 경계를 통해 통신 할 수있는 프로그램이나 객체를 만든다. 아니면 렉스 Yacc에 들이고 스캐너와 파서 생성기 다양한 최고의 알려진. 들은 상태 머신의 입력과 발생 부호로서 사양 구문. 또한 코드 생성기가 해킹 컴파일러, 독자적인 프로그래밍 언어 나 단방향 대화 상자 나 마법사를 포함하는 그래픽 도구, 마법사 대화 상자 또는 설계 시간보다는 컴파일 된 코드는 희미합니다. 우리의 고객은 고유의 C ++ 컴파일러 또는 특정 통합 개발 환경에 고정되지 않지만 그들이 원하는 어떤 도구를 사용 할 수 있도록 할 수 있습니다. UNIX의 정신으로 더 라인, 명확하게, 더 안전 : 우리는 오히려 생성 된 소스 코드 저장소에 코드 프로그래머를 강요하는 것보다, 우리의 도구에서 자신의 빌드 시스템에 추가하도록 격려.

GUI는 동적

  C ++는, 표준화 된 강력하고 잘 설계된 보편적 인 언어입니다. 제품은 일반 데스크톱 응용 프로그램에 전체 운영 체제의 응용 프로그램, 데이터베이스 서버, 하이 엔드 그래픽 다양한 응용 프로그램을 포함하는 소프트웨어 프로젝트의 같은 넓은 범위에서 사용되는 유일한 언어입니다. 는 C의 성공에 대한 하나의 키 ++ 언어는 여전히 ANSI C.와의 호환성을 유지하면서, 최대의 성능 및 최소 메모리 소비에 초점을 맞추고, 확장 가능한 디자인
  이러한 장점에도 불구하고, 몇 가지 단점이있다. C ++를 들어, 목표 C.에 대한 동적 메시징 방법과 컴포넌트 기반 프로그래밍 그래픽 사용자 인터페이스를 참조 할 때, 정적 개체 모델 분명히 도움이되지 하이 엔드 데이터베이스 서버 또는 운영 체제는 반드시 올바른 디자인 선택이 프론트 엔드 GUI에 좋은 일이 아니다. MOC를 사용하여, 우리는 필요한 안전하고 효율적인 그래픽 사용자 인터페이스 프로그래밍 도전에 대응하기 이러한 장점으로 단점 및 향상된 유연성을 가지고있다.
  우리의 접근 방식은 지금까지 당신이 템플릿을 사용하여 할 수있는 일을 넘어 간다. 예를 들어, 우리는 개체 속성을 가질 수 있습니다. 우리는 또한 신호와 슬롯을 오버로드 할 수 있습니다, 우리의 신호는 우리가 바이너리 호환성을 깨지 않고 새로운 신호를 추가 할 수 있다는 것을 의미한다 제로 바이트 크기의 클래스 인스턴스에 추가됩니다.
  또 다른 이점은 우리가 실행 시간 신호 및 슬롯에 객체를 탐색 할 수 있다는 것입니다. 우리는 물체의 정확한 유형이 연결되어 알 필요없이, 연결을 설정하는 이름으로 형태 보증 된 전화를 사용할 수 있습니다. 템플릿 기반의 솔루션은 불가능합니다. 이 런타임 반성은 Qt는 디자이너의 XML UI 파일의 생성 및 GUI 연결과 같은 새로운 가능성을 연다.

전화 성능이 전부는 아니예요

  QT 신호 슬롯 구현 너무 빨리 용액 템플릿 기반 아니다. 공통 템플릿의 사용은 네 개의 일반 함수 호출 오버 헤드에 대한 비용을 달성하기 위해 신호를 보낼 수 있지만, 필요한 작업의 양이 10 Qt는 함수 호출에 해당하지만. Qt는 메커니즘이 대기 공통의 그룹화와 통화, 자기 반성, 다른 스레드뿐만 아니라 최종 스크립트 기능을 포함하기 때문에, 놀라운 일이 아니다. 그것은 너무 많은 인라인 확장, 코드를 따라하고, 최고의 안전 런타임을 제공하지 않습니다. Qt는 반복자는 안전하고 템플릿을 기반으로하는 빠른 시스템이 아니다. 비록 복수의 수신기로 신호를 전송하는 과정에서, 수신기는 충돌을 일으키지 않고 안전하게 제거 할 수있다. 이 보안없이 응용 프로그램이 결국 메모리를 읽거나 쓰기 오류 디버그 어려운 나타납니다, 붕괴됩니다.
  그러나, 템플릿 기반 솔루션 Qt는 정말 오버 헤드 탱크 소량 호출 신호의 비용을 증가되지만 신호 슬롯? 수행하여 애플리케이션 성능 있지만, 전체 호 슬롯 비용의 일부만의 비용을 개선 할 수 없다. QT 신호 및 시스템의 슬롯은 일반적으로 오목 기준을 사용 하였다. 한 슬롯에 (예를 들어, 몇 가지 간단한 문자열 조작을) 유용한 작업을 수행, 당신은 오버 헤드 무시할 호출 할 수 있습니다. QT 시스템은 새로운 조작을 필요로하거나 더 비싼 신호보다 (/ 예컨대, 문자열 처리 또는 삽입 템플릿의 컨테이너에서 어떤 내용을 삭제) 삭제 오퍼레이션을 최적화된다.
  나레이터 : 당신이 미션 크리티컬 내부 루프의 성능을 신호 및 홈 연결이 닫습니다, 당신은 병목 현상이 연결을 사용하는 경우, 오히려 신호와 슬롯보다 표준 리스너 인터페이스 모드를 사용하는 것이 좋습니다. 1 연결 :이 경우, 당신은 단지 1 필요할 수 있습니다. 네트워크 데이터 객체에서 다운로드 한 경우 예를 들어, 요청 된 데이터가 도착했습니다 나타 내기 위해 신호를 사용, 이것은 매우 영리한 디자인이다. 당신이 소비자에게 개별적으로 각 바이트를 전송해야하는 경우, 오히려 신호와 슬롯보다, 리스너 인터페이스를 사용합니다.

에는 제한이 없습니다

  우리가 MOC 신호와 슬롯 지원을 가지고 있기 때문에, 그래서 우리는 템플릿이 할 수있는, 거기에 다른 유용한 물건을 추가 할 수 있습니다. 이러한 전환 TR (의해 생성 기능), 및 등록 시스템 및 확장 된 런타임 내성의 타입 정보와 상세를 포함한다. 속성 시스템 자체가 큰 장점입니다 : 당신은 매우 쓰기 어려운 (불가능하지는 않더라도)입니다 Qt는 디자이너 매우 강력하고 보편적 인 사용자 인터페이스 디자인 도구와 같은 강력하고 내성적 인 속성 시스템을하지 않은 경우. 하지만 거기서 끝나지 않습니다. 우리는 또한 RTTI 시스템에 의존하지 않는 동적 qobject_cast () 메커니즘을 제공합니다, 그래서 한정되지 않는다. 우리는 안전하게 동적으로로드 인터페이스 구성 요소를 쿼리하는 데 사용합니다. 다른 응용 분야는 동적 요소 목적이다. 예를 들어, 우리는 Meta Object를 만들 런타임에, 그 주위 ActiveX 구성 요소를 사용할 수 있습니다. 또는 우리는 Qt의 메타 오브젝트 수출하여 ActiveX 구성 요소 조립 Qt를로 내보낼 수 있습니다. 당신은 두 가지를 할 템플릿을 사용할 수 없습니다.
  는 C ++ 고유의 성능과 확장 성을 장점을 유지하면서 MOC는 ++ 자연 유연성 목표-C 또는 우리를 위해 자바 런타임 환경을 제공하는 C를 사용합니다. 그것은 유연하고 편안 Qt는 오늘날 우리가 가지고있는 도구가 될 수 있습니다.

추천

출처blog.csdn.net/a844651990/article/details/93022953