2012-02-18 5 views
2

Invoke 메서드가 별도의 스레드에서 실행되고 메인 스레드에서 호출되는 Qt 프로젝트를 수행하고 있습니다. QByteArray을 const로 전달하면 빌드가 실행됩니다. 그러나 const를 제거하면 컴파일되지만 실행하려고 할 때 종료됩니다 ( ). Q_ASSERT(b) 어설 션을 발생시킵니다.QMetaObject :: invokeMethod는 non const 인수를 취하지 않습니다.

왜 종료 되나요?

QByteArray에 데이터를 추가해야합니다.

const bool b = QMetaObject::invokeMethod(m_thread, "calculateSpectrum", 
           Qt::AutoConnection, 
           Q_ARG(QByteArray, buffer), 
           Q_ARG(int, format.frequency()), 
           Q_ARG(int, bytesPerSample), 
           Q_ARG(qint64, dataLength)); 
    Q_ASSERT(b); 
    Q_UNUSED(b) // suppress warnings in release builds 
+0

'calculateSpectrum'의 서명은 무엇입니까? 호출자에서 '버퍼'가 수정 될 것으로 예상됩니까? – Mat

+0

예 버퍼 및 시그너처가 스펙트럼 분석기 (qbytearray 버퍼, int 주파수, int 바이트, qint64 데이터 길이)를 변경하려고합니다. – ken

+0

올바른 방법의 서명을 질문에 편집하십시오 (태그 아래의 "편집"링크 사용). – Mat

답변

4

는 기본적으로 QMetaobject :: invokemethod의 서명은 지금

bool invokeMethod (QObject * obj, const char * member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()); 

이 우리가 구문입니다 Q_ARG 매크로를 사용하는

이 ..

QGenericArgument Q_ARG (Type, const Type & value) 

을 필요로하는 ...입니다 const 매개 변수

이제이 const 매개 변수를 제거하면 조건이 false가되고 런타임에 어설 션을 throw합니다.

관련 문제