2016-08-11 1 views
0

Qtを使用してネットワークベースのAPIと対話するプログラムを作成しています。 APIとのやり取りはXMLメッセージ(クエリと結果の両方)で行われますQTcpSocketデータを待っているときにGUIをブロックします。

共有ライブラリプロジェクトのクラスで通信とデータ処理を実装しました。ユーザーが接続の詳細を入力できるQMainWindowがあります。接続ボタンをクリックすると、次のようになります。 1.接続クラスのインスタンスが作成されます。 2.接続メッセージがAPIに送信され、セッションIDが取得されます。答えは解析され、セッションIDがクラスインスタンスに格納されます。 3.いくつかのフィールド情報を取得するメッセージがAPIに送信されます。次にXMLは解析され、必要なフィールド情報が抽出され、APIからデータが取得されます。 4.別のメッセージが送信され、フィールドに一致するデータが取得されます。次に、XML回答を解析し、処理するためにデータ構造に格納する。 5.データが処理され、最終的にユーザーに表示されます。

ライブラリをテストするための簡単なコンソールプログラムを作成しました。正常に動作しています。前のメッセージのすべてのデータが処理される前にメッセージは送信されません。しかし、QMainWindowインスタンスで同じプロセスを実装すると、待機は発生せず、メッセージは待たずに次々に送信されます。

次のメッセージを送信する前に、完全な処理を待つようにGUIスレッドをブロックするにはどうすればよいですか?

ありがとうございました

+2

GUIスレッドをブロックしないでください。次のメッセージを送信しているイベントを確認するためにコードを修正してください。それが適切であれば、すべてのtcpは別のスレッドにコードを送信/受信します。 – Matt

+0

私は一般的にGUIスレッドをブロックするべきではないことを知っていますが、この場合、抽出するデータはレンダリング前に処理する必要があるためです。私はユーザーがプロセスを中断できないようにしたい。 – FredCpp

+0

本当に必要な場合は?ポップアップダイアログを使用するか、関連するGUI項目を個別にブロックします。ちょうどすべてのアプリのように。 – Matt

答えて

2

イベントループをブロックすることでUIをブロックすることはできません。必要なのは、ある

connect(button, &QPushButton::clicked, button, [this]{ 
    if (! hasAllData) return; 
    // react to a button press 
}); 

:どちらか文字通りそれらにdisable()メソッドを呼び出すことによって、またはいくつかの状態変数に基づいて対話を守ることで、例えば - あなたとの相互作用を許可したくないウィジェットを無効にすることで行われていますアプリケーションの状態を定義し、適切な状態で適切なウィジェットを無効にします。私はセッションが確立されたら、とにかくすべてのクエリを並行して発行するのが最も速く、返信がリアルタイムで返ってくるのでUIを非同期に更新すると思います。

関連する問題