2015-01-17 2 views
1

올바른 방법은 무엇입니까 싱글 톤 패턴이 QObject이고 멀티 스레딩과 함께 사용됩니까? 물론이 방법은Qt 멀티 스레드 QObject 싱글 톤

QObject를 같이 모든 Qt는 멀티 스레딩 오류를 제외해야합니다 : 다른 스레드에있는 부모를위한 어린이를 만들 수 없습니다.

답변

0

나는 이것을하기위한 일반적으로 올바른 방법이 있다고 생각하지 않습니다. 문제는 최신 소프트웨어에서 Singleton 패턴을 피하는 것입니다. 특정 객체에 대한 전역 참조를 사용하면 단위 테스트가 정말 어렵고 때로는 불가능 해지기 때문입니다.

나를 오해하지 마십시오. 논리적 인 것으로 보이는 곳에서 싱글 톤을 갖는 것이 좋습니다. 문제는 전역 변수 또는 MySingletonClass::getInstance()과 같은 함수를 통해 액세스하는 패턴에 있습니다.

대신 생성자 매개 변수 또는 설정 메소드를 통해 필요한 곳에 주입하십시오.

멀티 스레딩 (Multithreading)에 대하여 : 저는 싱글 톤 (Singletons)이이 측면에서 특별한 것은 아니라고 생각합니다. 이들은 동시에 액세스되는 모든 객체와 같습니다.

+0

하나의 예 - 나의 싱글 톤은 고유 한 인스턴스 여야하는 네트워크 연결입니다. 내가 GUI를 동결을 피하기 위해 동시에 사용하고 싶지만 내가 질문에 쓴 오류가 있습니다. stackoverflow에있는 사람들은 "힙에 객체를 만들고 ..."라고 말하지만 그것은 싱글 톤입니다. 힙에 만들 수는 없으며 고유해야합니다. –

+0

그게 전부입니다. 당신은 uniqe을 가질 수 있습니다. 반드시 힙에 만들 수 있습니다. 왜 그럴 수 없습니까? 싱글 톤에 관한 주제를 연구하십시오. 싱글 톤을 사용하는 것이 싱글 톤 _ 패턴 사용과 다른 점을 이해하십시오. 이것은 좋은 출발점이 될 수 있습니다 : [link] (http://stackoverflow.com/questions/7267061/alternatives-to-singletons). –

0

런타임 오류 메시지는 Qt에만 적용되며 C++에는 해당되지 않습니다. 물론 당신은 원하는대로 각 스레드마다 다른 스레드에서 생성 된 객체를 사용할 수 있습니다. 하지만 다른 스레드에서 생성 된 객체에 부모 (즉 Qt)를 전달할 수 없으므로 부모는 자식이 파괴되는 동안 자식을 파괴 할 수 없습니다. 또한 Qt 메시징 메커니즘 및 타이머와 관련이 있습니다. QObject::moveToThread 설명이 흥미 로울 수도 있습니다.

관련 문제