2014-11-11 8 views
3

나는 우아한 방식으로 해결할 수없는 문제를 발견했습니다. 상황 : 응용 프로그램 외부에서 호출되는 콜백 함수가 있습니다. 콜백 함수는 일부 gui 객체를 업데이트해야합니다. 다른 스레드 내에서 (예를 들어) repaint()을 호출 할 수 없기 때문에 몇 가지 방법으로 기본 이벤트 루프에 함수 호출을 추가해야합니다. 시각.Qt add 함수 호출을 다른 스레드에서 이벤트 루프로 호출

한 가지 가능한 방법이를 사용하는 것입니다 :

QMetaObject::invokeMethod(object, "functionName", Qt::QueuedConnection, Q_ARG(float, value)); 

그러나 이것은 단지 나에게 no such Method "Object::functionName" 그 응답을 제공합니다. (이것은 거짓말입니다!)

또한 이벤트 유형에서 Qt::QueuedConnection으로 설정하여 이벤트 루프에서 호출 할 신호를 연결하는 방법에 대해서도 읽었습니다. 그러나 QOjbect.:connect()을 사용하면 신호가 필요한 객체를 알지 못하기 때문에 작동하지 않습니다. 멋진 뭔가 QObject::emit(object, SIGNAL(function(flaot)), arg);

+0

보통'QMetaObject :: invokeMethod'있다 잘 작동합니다. 또한 거짓말하지 않습니다. 호출에 오자가 있으면 런타임에 평가되므로 함수가 존재하는지 여부를 컴파일러가 확인하지 않고 실패하고 해당 메시지를 출력합니다. 전화를 확인하면 작동합니다. – Zaiborg

답변

2

QMetaObject::invokeMethod

같은 것은 당신이 이런 상황에서 무엇을 사용해야 보통 일 것이다. 다음 사항을 확인합니다

  • object 중 하나의 슬롯 부분에 선언 된 최고
  • functionName에서 Q_OBJECT 매크로와 QObject를 서브 클래스이거나 Q_INVOKABLE 매크로
+0

안녕하세요, 슬롯으로 선언하면 도움이됩니다. 어떻게 든 그것을 놓쳤다. 감사! "더 빠른"방법은 없습니까? 응용 프로그램은 상당히 성능이 뛰어나며 (실시간 오디오 등) 가능한 경우 CPU 시간을 절약하고 싶습니다. :) –

+1

사용자 정의 QEvent를 게시하는 AFAIK 또는 0ms QBasicTimer를 사용하는 것은 스레드간에 가능하지 않습니다. InvokeMethod는 상당한 오버 헤드를 가지고 있으므로 과거에 QMutex 또는 QSemaphore로 보호 된 모든 누적 데이터를 처리 할 수있는 가능한 한 적은 수의 호출로 호출을 배치하는 것이 중요합니다. – jturcotte