2017-02-14 6 views
0

QThread 클래스에서 여러 인스턴스를 생성했다고 가정합니다. 모든 스레드 개체가 동일한 Qthread 클래스에서 인스턴스화된다는 사실을 고려하여 스레드 개체 중 하나에서 다른 스레드 개체로 메시지를 보내야합니다. 신호를 내 보내면 모든 스레드 객체가 방출 된 신호를 수신합니다. 하지만 특정 객체 (예 : 특정 스레드 ID를 가진 객체)가 신호를 받기만하면됩니다. Qt에서 어떻게 할 수 있습니까?Qt에서 QThread 클래스의 특정 객체에 신호를 내보내는 방법은 무엇입니까?

감사합니다.

+0

는 경우에, 나는 (당신이 [이 문서]를 읽을 제안 https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use 소리 -qthreads-the-full-explanation /). QThread는 실제 스레드보다 스레드 컨트롤러에 가깝습니다. 따라서 Qt가 스레딩을 관리하는 방법을 변경하고 싶지 않으면 QThread를 상속하지 않는 것이 좋습니다. – TheDarkKnight

답변

2

신호 및 슬롯 클래스에을 정의 하지만 특정 객체의 슬롯에 특정 개체의 신호를 연결 . 하나의 스레드에서 신호를 방출하면 슬롯이 연결된 객체 만 해당 신호를 수신합니다.

+0

예 신호를 클래스의 슬롯에 연결합니다. 내 수업은 QThread 클래스에서 상속됩니다. 내가 필요한 것은 신호를 낼 때 동일한 클래스로부터 인스턴스화 된 모든 객체가 신호를 받기를 원하지 않는다는 것입니다. 모든 객체가 아닌 특정 객체에 신호를 보내고 싶습니다. 당신은 (http://doc.qt.io/qt-4.8/qobject.html#connect) 특정 객체가 아닌 클래스를 [연결] m.taheri @ –

+1

. 연결된 객체 만 신호를 수신합니다. 그렇지 않으면 전혀 의미가 없습니다. – w1ck3dg0ph3r

+0

예 개체를 서로 연결합니다. 하지만 연결된 개체 집합에서 특정 개체로 신호를 방출해야합니다. –

1

내가 제대로 이해하면 당신은해야 할 수도 QSignalMapper :

이 클래스는 매개 변수가 신호의 집합을 수집, 정수, 문자열이나 신호를 전송 객체에 해당하는 위젯 매개 변수를 다시 방출 .

자세한 정보는 예제를 확인하십시오. 신호 매퍼를 사용하지 않으려면 슬롯에 항상 사용자 정의 필터를 사용할 수 있습니다. 그래서 다른 모든 슬롯 (신호에 관심이없는)은 무시할 수 있습니다. 신호를 emit으로 필터링하여 지정된 연결된 슬롯으로 직접 전송하는 방법은 없습니다.

+0

는 @xander 감사하지만 내 객체가 스레드이며, 각 스레드는 고유 한 식별자를 가지고 있기 때문에 나는 QSignalMapper 내 목적에 유용 할 것이라는 점을 의심한다. 스레드를 생성하고 삭제하기 전에 맵을 채워야했기 때문입니다. 내 응용 프로그램에서는 스레드 수가 고정되어 있지 않고 스레드가 동적으로 추가되고 제거됩니다. 하지만 두 번째 제안은 유용 할 것이고 내가 할 수있는 유일한 방법이라고 생각합니다. 고맙습니다. –

0

신호와 같은 신호를 수신하고 연결하는 모든 인스턴스를 수신하는 사용자를 판별 할 수없는 신호의 발신자. 이것은 신호/슬롯 메커니즘이 구현하는 관찰자 패턴에 내재되어 있습니다.

I 파생 스레드 (예를 들어 A (1, ..., N)의) 그 자체를 등록하는 매개체를 만들 것이다. 조정자 (mediator)에서 A (i)의 메시지가 A (j)로 가야하는 논리를 구현해야합니다. 이점은 A 인스턴스가 서로를 알 필요가 없다는 것입니다. 상호 작용은 qt에 따라 스레드 세이프 이벤트를 게시하여 수행 할 수 있습니다. 당신이 QThread에서 상속하는 것처럼