1

bytesWrittenfunctionに接続して、ブロックしない方法で大きなファイルを転送しようとしていますsendNextBlock

void AsynchronousRetrieveCommand::start()
{
    connect(socket(), SIGNAL(bytesWritten(qint64)), this, SLOT(sendNextBlock()));
    sendNextBlock();
}

void AsynchronousRetrieveCommand::sendNextBlock()
{
    socket->write(file->read(64*1024));
}

このコードを Symbian 電話で実行しています。5 ~ 6 メガバイトが転送された後、電話に「メモリがいっぱいです」というメッセージ ボックスが表示され、デバッグ出力に次のメッセージが表示されます。

[Qt Message] CActiveScheduler::RunIfReady() returned error: -4

これはある種のメモリ リークだと思いますが、コードで何が原因なのかわかりません。

4

1 に答える 1

3

OK、データがフラッシュされるよりも速くソケットに供給されたため、ソケットのバッファが制御不能に成長していることが判明しました。

によって与えられた値をチェックし、bytesWritten大量のバイトだけを書き込むことで問題を修正しました (実際には、バッファを 64k に再充填します)。

私の修正コードは次のようになります。

void AsynchronousRetrieveCommand::start()
{
    connect(socket(), SIGNAL(bytesWritten(qint64)), this, SLOT(sendNextBlock(qint64)));
    sendNextBlock(64*1024);
}

void AsynchronousRetrieveCommand::sendNextBlock(qint64 bytes)
{
    socket()->write(file->read(bytes));
}
于 2012-12-16T11:30:37.090 に答える