2017-07-18 19 views
0

QMLでasync functionを使用できるかどうかは疑問です。QMLのJS非同期関数

async function additem(clientName){ 
    myListModel.append({name:clientName}); 
} 

の代わりにこの使用:このよう

function additem(clientName){ 
    myListModel.append({name:clientName}); 
} 

を、私はそれを試してみたと私は構文エラーを取得:期待トークン: ' `と任意のドキュメントを見つけることができませんでした約QML対応JavaScript "async function"です。

なぜでしょうか? QMLで使用できるJSで非同期処理を行う方法が他にある場合はおそらくですか?

注:データ全体がモデルに追加されるまでをフリーズは、私は私のListModelのにデータを追加したいと私はアプリケーション全体をしたくないその進捗状況としてそれを見たいと思っています。

あなたの時間を感謝します。

+0

@JaromandaXブラウザでエラーが発生することはありません。ブラウザで正常に動作しますが、QMLでは正常に動作しません。また、エラーは '予想されるトークン:' '私が行方不明になっているようです**":** ** – Bear

+0

私の謝罪です。私はあなたが尋ねていたことを誤解していました –

+0

[this](http://doc.qt.io/qt-5/threads-technologies.html#workerscript-threading-in-qml)でも見ることができますが、おそらく[this] (https://github.com/benlau/quickpromise)。 – BaCaRoZzo

答えて

-4

QMLあり!
使用WorkerScriptは、私はあなたがQtのフォーラムに投稿この質問の拡張版の一部に答え:)

+0

Jaromandaxとfolibisの示唆に感謝しますが、それは可能な解決策の1つですが、QMLライブラリを読み込まないため別の問題が発生します。私はもっ​​と純粋なJavascript関数ではなくライブラリを使わずに別々に実行するのではなく、javascript関数を非同期化できる方法を探していました。ダウン投票者に – Bear

+0

:答えに問題や間違いがある場合は、コメント内で説明することができます。これは助けと何かを明確にする原因になります。 –

+0

親愛なる@Bear「WorkerScript」は、別のスレッドでqmlを実行しない単純な計算操作に使用できます。しかし、プラグイン操作をいくつかの計算JSとQML部分に分割することができるかもしれません。この場合、計算用JS部分を別のスレッドに移行することができます。おそらく私はあなたを助けることができるサンプルコードスニペットを投稿する場合。とにかくもっと力と柔軟性が必要なら、C++と 'QThread'に行き、結果をGUIスレッドで表示する必要があります。 –

0

here.を説明しますが、非同期一部に対処していなかったとして。

ここに投稿した例のは、何もロックされない本質的な瞬間関数であるため、ここで示した例から、非同期関数呼び出しを探している理由がわかりません。

あなたは何をしようとしているのか、それがUIをフリーズする方法についてもう少し説明できますか?

問題はあなたがタイトループで

function additem(clientName){ 
    myListModel.append({name:clientName}); 
} 

000回を実行していることであり、それはあなたのUIが凍結されている理由を、私はいくつかの可能な解決策を考えることができるなら。

リストビューのforceLayout()メソッド(http://doc.qt.io/qt-5/qml-qtquick-listview.html#forceLayout-method)を定期的に(addItemごとに、または10または20のaddItemごとに)呼び出します。これはListViewを強制的に更新してモデルの変更を反映するように設計されています。

これは、この特定のケースではおそらく最も簡単な解決策です。

非同期機能が必要な場合は、短期間(たとえば20ms)のタイマーを使用してタスクのサブセットを実行し、UIを更新したり、別のタスクを実行したりすることができますタスクのバッチなどが含まれます。

コールバック関数を使用すると便利です(関数を呼び出して忘れてしまいますが、作業が終わったときに実行するコールバック関数を渡すなど)。

+0

返信いただきありがとうございます。はい、私はQt Forumで例を挙げましたが、あなたが説明した**コールバック**も私が望むものですが、コールバックはそれを行いますか?非同期で実行されるコールバックをどのように設定しますか?私はjavascriptで試しましたが、コールバックが値を返すまでそれはまだ待ちます!ここにリンクがあります:https://jsfiddle.net/efvv45aw/ – Bear

+0

私はあなたのフィドルを理解していません。それは実際にベーコンを遅らせるわけではありません。関数を実行してコールバックを後で実行するには、次のようなやり方があります。https://jsfiddle.net/o2ts45dr/ – WaltPurvis

+1

また、この例では非同期について考えようとしています。QMLのJavaScriptエンジンにはsetTimeout関数がないため、コールバックの作成には使用できません。 – WaltPurvis

関連する問題