2016-10-27 2 views
0

Qt에서 여러 스레드가 'emit'을 사용하여 많은 수의 신호를 보내면 트리거가 매우 느립니다. 큐잉 메커니즘이있는 것처럼 보입니다. 회선의 신호 슬롯을 빠르게 트리거하는 좋은 방법이 있습니까?Qt에서 신호 슬롯을 빠르게 트리거하는 좋은 방법이 있습니까?

+0

신호를내는 스레드에서 슬롯을 호출 하시겠습니까? 그렇다면 스레드가 안전한지 확인하고 호출하는 모든 것이 스레드로부터 안전합니다. 특히, GUI 작업은 모두 메인 스레드에서 이루어져야합니다! – hyde

답변

1

당신이 묻는 것은 Qt::DirectConnection입니다. 슬롯이 즉시 호출되도록하려면 connect()에 지정해야합니다.

가 사용될 때 상기 신호가 방출 될 때

슬롯 즉시 호출된다. 슬롯은 신호 스레드에서 실행됩니다.

그렇지 않은 경우 기본 Qt 방식은 Qt::AutoConnection입니다.

신호를 보내는 스레드에 수신기가있는 경우 Qt :: DirectConnection이 사용됩니다. 그렇지 않으면 Qt :: QueuedConnection이 사용됩니다. 연결 유형은 신호가 방출 될 때 결정됩니다.

당신은 connect()에서 연결 유형을 지정할 수 있습니다 :이 두 가지 방법과 사용하는 here이다 사이의 차이에 대한

QMetaObject::Connection QObject::connect(const QObject *sender, const  
    char *signal, const QObject *receiver, const char *method,  
    Qt::ConnectionType type = Qt::AutoConnection) 

아주 좋은 대답.

+0

물론 슬롯 메서드는 스레드 안전성이 있어야합니다. 예를 들어 GUI를 업데이트하는 것은 제외됩니다. 실수로 스레드가 안전하지 않은 슬롯에 직접 스레드 간 연결을하는 것을 피하기 위해 스레드 안전 슬롯과 또 다른 "정상"슬롯을 갖는 두 개의 관련 클래스로 논리를 분리하는 것이 더 좋을 수 있습니다. – hyde

+0

@hyde 동의하지만 우리는 어떤 시작 주제가 슬롯에서하고 싶어하는지 알지 못합니다. 그는 대기열을 사용하지 않고 슬롯을 호출하는 방법을 묻습니다. – demonplus

+1

예, TBH는 XY 문제와 같은 것 같습니다 ... – hyde

관련 문제