2012-06-27 3 views
5

나는 작업중인 일부 소스 코드를 파고있었습니다. 나는 누군가가 암호를 작성했다는 특이한 진술을 발견했다. 소스 코드는 QML GUI가있는 GUI 응용 프로그램이며 QT 4.7.x를 사용합니다.QObject 기반 클래스 자체에 대기중인 연결이 있습니다.

아래 스 니펫은 핵심 애플리케이션 로직에 속합니다.

// connect signal-slots for decoupling 
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection); 

그것은 개체가 본질적 의미 대기중인 연결을 통해 자체에 연결하는 이상한 그 같은 시간에 다른 스레드에서 할 수있다 "라이브"개체?

언뜻보기에는 나에게 어떤 의미가 없었습니다. 누구나 그러한 연결이 그럴듯하거나 필요한 이유가 무엇인지 생각할 수 있습니까? 이것도 작동할까요?

답변

9

아무 문제없이 작동합니다. 어쩌면 SetCurrentTaskSlot을 호출하기 전에 필요한 이벤트 루프 처리가 있습니까?

QueuedConnection은 다른 스레드에 있음을 의미하지 않습니다. QueuedConnection은 신호가 방출 될 때 해당 슬롯이 직접 호출되지 않는다는 것을 의미합니다. 이벤트 루프에 대기하고 제어가 이벤트 루프로 되돌려지면 처리됩니다.

+0

의미가 있습니다. 나는 아직도 코드를 둘러싼 것들을보고있다. 그래서 나는 일이 끝나면 다시 돌아올 것이다. –

+1

그래서 일부 계산을 수행하는 동안 작업 변경 신호가 방출되고 "변경"이 즉시 발생해서는 안되지만 현재 흐름이 실행되고 이벤트 처리가 다시 시작된 것처럼 보입니다. –

3

대기열에있는 연결은 수신자의 거주지를 의미하지 않습니다. 그 반대는 사실입니다. 다른 스레드에있는 객체에 안전하게 신호를 보내려면 대기중인 연결을 사용해야합니다. 그러나 당신은 어떤 스레드에 살고있는 객체에 사용할 수 있습니다!

하나는 대기 연결을 사용하여 신호가 이벤트 루프 내에서 전달되고 직접 연결로 발생하는 것처럼 방출 사이트에서 즉시 전달되지 않도록합니다. 직접 연결은 개념적으로 목록에서 함수 포인터에 대한 호출 집합입니다. 대기 연결은 개념적으로 이벤트 내용에 따라 함수 호출을 실행할 수있는 영리한 수신자에게 전송되는 이벤트입니다.

이벤트는 내부 QMetaCallEvent이며이 이벤트에 따라 동작하고 호출을 실행하는 것은 QObject::event입니다.

관련 문제