저는 Qt
을 처음 사용합니다. std::thread
인 작업자 스레드가 있습니다. 작업자 스레드 함수는 루프의 일부 데이터를 계속 가져옵니다. 데이터의 크기는 요소에서 QML
UI로 자주 업데이트됩니다. 나는 청취자 콜백을 가지고 있는데, 이는 단지 std::function
이며, thread's function
에서 호출된다. 그것은 내가 Text
요소를 업데이트 한 것을 기반으로 콜백을 QML
에 보냅니다. 나는 signal slot
메커니즘을 사용하여 업데이트합니다.작업자 스레드에서 Qt :: 신호를 내면 UI가 기본 스레드로 기본 업데이트됩니까?
Text {
id: mytext
objectName: "mytextobject"
function slotUpdateData(someValue){
mytext = someValue
}
}
SignalUpdateData
가 QML
측에있는 slotUpdateData
접속되어
다음은 QML : Text
요소이다. std::thread
에서 데이터 이벤트 콜백을받을 때마다 emit SignalUpdateData
은 QML Text element
을 UI
으로 업데이트합니다. 다음
void CallBackReceivedFromWorkerThread(float someValue) {
emit SignalUpdateData(someValue)
}
내가 QML slot
QObject::connect(this, SIGNAL(SignalUpdateData(QVariant)), myTextItemQObject, SLOT(slotUpdateData(QVariant)));
으로이 C++ signal
을 연결 한 그리고이 모든 것이 잘 작동하는 방법입니다. 아무런 충돌도 일어나지 않습니다.
내 이해에 따르면, 작업자 스레드의 기능이 콜백을 트리거하므로 콜백을 받으면 실행 제어가 작업자 스레드에 있습니다. 따라서 emit SignalUpdateData(someValue)
을 수행 할 때 우리는 여전히 작업자 스레드에 있습니다. 이전 경험에서 알 수 있듯이 android
& java
은 애플리케이션의 main thread
외부에서 UI를 업데이트 할 수 없습니다.
그래서 어떻게 작동합니까? 에 emit SignalUpdateData(someValue)
전화가 걸립니까? 에서 전화를 걸어도 Qt
이 main thread
에 UI 변경을 계속하고 있습니까? 내 접근 방식이 괜찮 으면 성능에 영향을 미칩니 까? 가장 좋은 방법은 무엇입니까?
나는이 점에 대해 매우 확신하고 싶습니다.이 부분을 작동 시키려면 운이 좋은 것은 아닙니다. &. 최상의 접근을 위해 Qt::Connection_enum도 사용해야합니까?
내가 아는 한 (틀릴 수도 있음) 모든 QML은 주/GUI 스레드에서 발생합니다. –