私はQt
を初めて利用しています。私はワーカースレッドがstd::thread
です。ワーカースレッド関数はループ内のいくつかのデータを連続的にフェッチします。データのサイズは、UIのQML
のText
要素で頻繁に更新されます。私はstd::function
以外のリスナーコールバックを持っており、thread's function
から呼び出されます。それは、私がText
要素をQML
に更新したコールバックを送信します。私はsignal slot
メカニズムを使用してそれを更新します。続いワーカースレッドからQt ::シグナルを送信すると、デフォルトでメインスレッドがUIを更新しますか?
はQML : Text
要素である:
Text {
id: mytext
objectName: "mytextobject"
function slotUpdateData(someValue){
mytext = someValue
}
}
SignalUpdateData
はQML
側に存在するslotUpdateData
に接続されています。 std::thread
からデータイベントコールバックを取得するたびに、にQML Text element
を更新する私はemit SignalUpdateData
です。続き
void CallBackReceivedFromWorkerThread(float someValue) {
emit SignalUpdateData(someValue)
}
は私がQML slot
QObject::connect(this, SIGNAL(SignalUpdateData(QVariant)), myTextItemQObject, SLOT(slotUpdateData(QVariant)));
そして、このすべてが正常に動作して、このC++ signal
が接続されている方法です。クラッシュ、ロックアップ、何もありません。
私の理解しているように、ワーカースレッドの関数はコールバックをトリガーしているので、コールバックを受け取ったときに実行制御がワーカースレッド上にあります。したがって、emit SignalUpdateData(someValue)
を実行すると、we'erはワーカースレッドに残ります。 私の以前の経験で知っている限り、android
& java
のように、アプリケーションのmain thread
以外の場所からUIをアップデートすることはできません。
だから、これはどのように機能しますか? emit SignalUpdateData(someValue)
はmain UI thread's event loop
にコールしていますか?私はworker thread
から電話していますが、Qt
はまだmain thread
にUIを変更していますか?私のアプローチがうまくいけば、それはパフォーマンスに影響しますか?これを行うための最良の推奨は何ですか?
私はこの&ないこれが機能することについてちょうど幸運については非常に確認したいです。最良のアプローチのためにQt::Connection_enumも使用する必要がありますか?
私が知っている限り(間違っているかもしれない)、すべてのQMLはメイン/ GUIスレッド上で発生します。 –