Я пытаюсь передать несколько изображений (на самом деле видео) между двумя процессами, используя QSharedmemory. В настоящее время я сериализую QVector QImages и копирую его в память. Это работает, но этапы сериализации занимают около 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;
}
Я думаю, что основная проблема для вашего буфера заключается в том, что его нужно многократно изменять. Попробуйте установить больший размер подчиненного байтового массива, чем ваши данные.
buffer.buffer ().resize (100000000);
Назовите это непосредственно перед сериализацией изображений.
Попробуйте использовать QImage.save
чтобы сохранить его в QByteArray
как «PNG», а затем скопируйте данные из этого в QSharedMemory
с memcpy.