1

リモート側にデータを書き込んでその応答を待ちたい場合、少なくともwaitForReadyRead. しかし、それを呼び出す前に、を使用して手動で出力キューをフラッシュする必要がありますwaitForBytesWrittenか、それとも Qt が自動的に書き込みキューをフラッシュしますか? 同期的に (ブロックして) 操作しているため、この関数ではイベント ループまたはローカル イベント ループを使用できません。

を使用するstd::cinと、以前に によって書き込まれたバイトstd::coutがフラッシュされたことを確認できます。それは類似の状況です - Qt ソケットにも適用されますか?

4

2 に答える 2

0

抽象基本クラスであるソース コードを見ると、QIODevice は waitForReadyRead でほとんど何もせず、継承されたクラスの実装次第です。

bool QIODevice::waitForReadyRead(int msecs)
{
    Q_UNUSED(msecs);
    return false;
}

Qtソケットにも適用されますか?

同期的に動作していると述べたように、これを選択したのには理由があると思います。メインスレッドでは、GUI の存在は呼び出し中にフリーズしwaitForReadyReadます。通常、QIODevice の非同期使用が好まれ、Qt はイベント駆動型フレームワークです。

ただし、Qt ドキュメントには次のように記載されています。

QTcpSocket や QProcess など、QIODevice の特定のサブクラスは非同期です。

したがって、QIODevice が QTcpSocket などのソケットである場合は、いいえ、を呼び出すwaitForBytesWrittenときに呼び出す必要はありませんwaitForReadyRead

非同期デバイスの場合は、これが必要になります。

于 2015-10-19T12:20:18.010 に答える