1

QSharedmemory を使用して、2 つのプロセス間で複数の画像 (実際にはビデオ) を渡そうとしています。現在、QImages の QVector をシリアル化し、これをメモリにコピーしています。これは機能しますが、シリアル化の手順に約 99% の時間がかかります。プラットフォームに依存しない方法でこれをより速く行うにはどうすればよいですか?

送信するための私のコード:

int main(int argc, const char* argv[])
{
QObject *parent;

QString program = "python";
QStringList arguments;
QString programPath(PYSOURCE);
arguments << "-u" << programPath+QString("/test.py");
qDebug() << arguments;

QProcess *pyProcess = new QProcess();
pyProcess->start(program, arguments);

QVector<QImage> images;
//.. fill with some images

auto start = std::chrono::system_clock::now();
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);

// this takes extremely long ~44s for 80mb
out << images;

int size = buffer.size();

QSharedMemory sharedMemory("process_example");
if (!sharedMemory.create(size)) {
    qDebug() << "Unable to create shared memory segment.";
    return 0;
}

qDebug() << "sizeof mem: " << sharedMemory.size() << "bufsize:" << buffer.size();
sharedMemory.lock();


char *to = (char*)sharedMemory.data();
const char *from = buffer.data().data();
memcpy(to, from, qMin(sharedMemory.size(), size));

sharedMemory.unlock();  

qDebug() << "image copied to shared memory";
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - start);
qDebug() << "duration:" << duration.count() << "ms";

while (pyProcess->waitForReadyRead(-1)){
QByteArray newData = pyProcess->readAllStandardOutput();
QString result = QString::fromLocal8Bit(newData);
qDebug(qPrintable(QString("py:")+result));

}
sharedMemory.detach();

return 0;
}
4

3 に答える 3

0

バッファの主な問題は、サイズを何度も変更する必要があることだと思います。アンダーリングバイト配列の大きなサイズを、データが必要とするよりも大きなサイズに設定してみてください。

buffer.buffer ().resize (100000000);

イメージのシリアル化の直前にこれを呼び出します。

于 2016-01-20T14:42:48.637 に答える