2012-05-31 2 views
3

저는 Swing을 사용하여 Java로 애플리케이션을 작성했으며 이제는 C++로 다시 작성하려고합니다. Java의 프로그램에는 Controller에 대한 Model, View 및 BlockingQueue에 대한 참조가있었습니다. View에서 새로운 이벤트가 발생하면 BlockingQueue에 새 이벤트가 입력되고 컨트롤러 및 모델에 의해 처리됩니다. SwingUtilities.invokeLater()에 의해 Swing에서 어떤 액션이 호출되었습니다.자바 애플리케이션을 C++ (Qt)로 이식하기

Qt를 사용하여 C++에서 이렇게하는 방법은 무엇입니까? 모델을 작성했지만 Java에서 BlockingQueue와 같은 것을 통해 Qt로 작성된 UI와 연결하는 방법을 모르겠습니다.

+0

Java Native Interface를 원하셨습니까? –

답변

1

가능하면 스레드를 사용하지 않는 것이 좋습니다. 당신 쪽에서 더 이상 설명이 없으면 Qt documentation for signals and slots을 살펴볼 것을 권합니다. 간단히 말하면, Qt에서 이벤트 처리의 기본 방법은 신호와 슬롯입니다. 위젯과 상호 작용하면 신호가 트리거됩니다. 수업은 과 같은 신호에 자체를 연결하여 이에 반응 할 수 있습니다.

나는이 대답이 아주 모호하다는 것을 알고 있습니다. 에 대한 세부 정보를 추가하면 정확히을 수행하고 싶습니다. 나는 행복하게 업데이트 할 것입니다.

1

BlockingQueue에 해당하는 것은 각각 QObject에 내재되어 있습니다. QObject에 대한 Qt 문서에는 명시 적으로 언급되어 있지 않지만 (그래야만합니다!), 거기에있는 모든 QObject에 대해 효과적으로 이벤트 대기열이 있습니다. 정적 QCoreApplication::postEvent 메서드를 사용하여 모든 스레드에서 모든 QObject에 이벤트를 게시 할 수 있습니다. QObject에 대한 포인터가 있으면 해당 스레드에 이벤트를 게시 할 수 있습니다.

Qt::QueuedConnection 유형의 신호 슬롯 연결은 동일한 이벤트 대기열을 사용하여 QMetaCallEvent 이벤트를 게시합니다. 해당 이벤트는 QObject::event()에 의해 감지되고 관련 슬롯에 대한 호출이 발생합니다. 제어가 스레드의 이벤트 루프로 돌아 가면 후자는 이벤트 큐를보고 이벤트를 QObject::event() 메소드에 전달합니다.

내장 된 이벤트 대기열은 본질적으로 QObject에 대한 액세스를 직렬화 할 수 있으므로 추가 동기화 기본 요소를 추가 할 필요가 없으며 교착 상태에 대해 스스로 설정하지 않기 때문에 매우 유용합니다. ad-hoc 동기화를 사용하면 문제가 발생합니다. Java는 불행히도 설계 상으로는 잘못되었습니다. 이 주제에 대한 Herb Sutter의 훌륭한 노출 : The Many Faces of a DeadlockAvoid Calling Unknown Code While Inside a Critical Section을 참조하십시오. 그는 다른 많은 것을 가지고 있습니다 publications on this and related topics, 그것은 지식의 진정한 보물입니다. 그는 또한 우수한 성능을 위해 단 순한 비동기식 애플리케이션을 설계하는 방법을 설명합니다.

신호 - 슬롯 및 이벤트 게시를 사용하여 QObject 및 이들 사이의 연결을 기반으로 디자인을 수행하는 경우 프로파일 링/벤치마킹에서 그렇게해야 할 필요가있는 경우 해당 QObject를 전용 QThread로 이동할 준비가 된 것입니다. QWidget에서 파생 된 것은 GUI 스레드를 벗어날 수 없다.

+0

이벤트 큐가 QObject 또는 QObject가 속한 QThread와 연결되어 있습니까? 예를 들어'worker = new QThread;를 사용하여 QObject를 새로운 QThread로 이동하는 데 익숙합니다. moveToThread (worker); worker-> start();'. 그러면'Qt :: QueuedConnection'으로'connect' 된 것은 그 쓰레드의 이벤트 큐를 자동으로 사용할 것입니다. 이 큐가 당신이 말하는 대기열입니까? –

+0

'QObject'의 사용자에게는 객체의 사용자가 다른 객체에 전달 된 이벤트를 보지 못하기 때문에 대기열이 객체와 관련이있는 것처럼 보입니다. 어떤 스레드의 객체인지에 상관없이 동작은 동일합니다 대기열이 실제로 주어진 스레드에서 생성 된 가장 바깥 쪽 이벤트 루프에 속한다는 것은 구현 세부 사항입니다. 실적에 대해 몇 가지 의미가 있습니다. 즉,이 세부 정보 때문에주의하지 않으면 2 차 동작을 얻을 수있는 코너 사례가 있습니다. 그러나 대부분의 경우 그것은 중요하지 않습니다. –