300Hz(300サンプル/秒)でデータを読み取るクライアントを実装する必要があります。 Cソケットで作業する場合、サーバーからデータを取得するために連続したwhileループを実行する必要があるという事実はすべて受け入れられました。 したがって、他のオブジェクトからクライアントオブジェクトに送られる信号を処理するために、QTcpsocketに移動しようと決めました。私はQtcpsocketを接続し、これは私のハンドラであるQTcpSocketを連続で高速に使用する
connect(socket,&QTcpSocket::readyRead, this, &client::handleReadyRead, Qt::ConnectionType::QueuedConnection);
を読み取るための信号を接続すると、しかし -
QByteArray b = socket->read(12);
int packetLength = (unsigned char)b[6] << CHAR_BIT;
packetLength |= (unsigned char)b[7];
b = socket->read(packetLength);
(私は各パケットの12バイト長のヘッダを取得する) 今、私は非常に入手します遅いクライアント - それはおそらく毎秒3サンプルを処理します...私はどのくらいbytesavailable()
が返ってきたかを確認しました。そして、データがソケットバッファーに積もっているように見えます。 私は何が間違っていますか?私は非常に高速なクライアントを取得する必要がありますが、私が読んでいる方法が最適であるとは確信していません。 これを行うより効率的な方法はありますか?
アプリケーションをプロファイルし、ボトルネックがどこにあるかを確認します。 –
私は実際にそれをテストするミニプロジェクトを使用しているので、かなり多くのクライアントが実行されています。プロファイリングでは、イベントループには多くの時間がかかりますが、回避することはできますか? – JLev
あなたは 'packetLength'バイトが利用可能かどうかを知らずに' socket-> read(packetLength) 'を呼びます。そうでない場合、次の読み取りはデータストリームと同期しなくなります。 –