3

QIODevice から派生した QLocalSocket を使用しています。のドキュメントはQIODevice::write言う

最大 maxSize バイトのデータを data からデバイスに書き込みます。実際に書き込まれたバイト数を返します。エラーが発生した場合は -1 を返します。

関数がバイト未満maxSizeのデータを書き込む状況と、ドキュメントがそれを教えてくれないように見える状況で混乱しています。私はこのようにループすることができます

for(int written = 0; written != len;) {
  int writtenNow = sock->write(data + written, len - written);
  if(writtenNow != -1) {
    written += writtenNow;
  } else {
    // oops, call cops!
  }
}

しかし、すべてのデータを書き込めない場合はどうすればよいでしょうか? 電話するべきwaitForBytesWrittenですか?のドキュメントによるとQLocalSocket、これは必要ないはずです

QLocalSocket はイベント ループで使用するように設計されていますが、イベント ループなしで使用することもできます。その場合、操作が完了するかタイムアウトになるまでブロックする waitForConnected()、waitForReadyRead()、waitForBytesWritten()、および waitForDisconnected() を使用する必要があります。

したがって、私は深く混乱しています。誰でもこれに光を当てることができますか?

4

1 に答える 1

0

この種の問題をこのように解決します。別のスレッドで書き込みメソッドを実行し、メインスレッドはブロックしません

...
QtConcurrent::run(this, &MyClass::writeAsync, sock, data);
...

void MyClass::writeAsync(QLocalSocket socket, QByteArray data) {
    socket->write(data);
}
于 2012-11-12T15:40:47.647 に答える