如何在QT中的QShared内存中写入多个数据

how to write more than one data in QShared memory in QT

本文关键字:数据 内存 QT 中的 QShared      更新时间:2023-10-16

我想向QSharedMemory写入4-5个变量,但我不知道该读该写。

我有五个不同数据类型的变量A、B、C、D、E。在下面的程序中,我将变量A写入共享内存。如何将其他变量也写入相同的?

此程序写入共享内存。

                 if(sharedMem.isAttached())
                   {
                   sharedMem.detach();
                   qDebug() <<"Here shared";
                   }
          QString text = QString::number(A);   // A is Passed
          QBuffer buffer;
          buffer.open( QBuffer::ReadWrite );
          QDataStream out( &buffer );
          out << text;
          int size1 = buffer.size();
          if ( !sharedMem.create( size1 ) )
          {
          qDebug() << "Unable to create shared memory segment.";
          return;
          }
          // Write into the shared memory
          sharedMem.lock();
          char *to = (char*)sharedMem.data();
          const char *from = buffer.data().data();
          memcpy( to, from, qMin( sharedMem.size(), size1 ) );
          sharedMem.unlock();

如果我正在传递所有5个变量,如何使用下面的程序检索这些变量。

这个程序从共享内存中读取。

  if (!sharedMem.attach())
       {
        ui->label->setText(tr("Unable to load!"));
        return;
       }
QBuffer buffer;
QDataStream in(&buffer);
QString text;
sharedMem.lock();
char* pointer = (char*)sharedMem.constData();
buffer.setData((char*)sharedMem.constData(), sharedMem.size());
buffer.open(QBuffer::ReadOnly);
in >> text;                                     // Reading A
sharedMem.unlock();

// As this is the last process attached to the shared memory segment
// the shared memory segment is released, destroying its contents
sharedMem.detach();

编辑:

我尝试使用QStringlist来传递所有变量,但我得到了错误。

我通过在第一个程序中连接QString并在第二个程序中使用QStringlist Split函数来解决问题。

此程序写入共享内存。

   if(sharedMem.isAttached())
   {
   sharedMem.detach();
   qDebug() <<"Here shared";
   }
   // I changed here . now A & B is Passed .
  QString text = QString::number(A)+ "," + QString::number(B) ;   

  QBuffer buffer;
  buffer.open( QBuffer::ReadWrite );
  QDataStream out( &buffer );
  out << text;
  int size1 = buffer.size();
  if ( !sharedMem.create( size1 ) )
  {
  qDebug() << "Unable to create shared memory segment.";
  return;
  }
  // Write into the shared memory
  sharedMem.lock();
  char *to = (char*)sharedMem.data();
  const char *from = buffer.data().data();
  memcpy( to, from, qMin( sharedMem.size(), size1 ) );
  sharedMem.unlock();

这个程序从共享内存中读取。

  if (!sharedMem.attach())
  {
  ui->label->setText(tr("Unable to load!"));
  return;
  }
  QByteArray read1;               // used ByteArray Change 1
  QBuffer buffer;
  QDataStream in(&buffer);
  QString text = QString(read);   // Change 2
  QStringList strlist = text.split(","); // Change 3
  int A = strlist.at(0).toInt(0);
  int B = strlist.at(1).toInt(0);

  sharedMem.lock();
  char* pointer = (char*)sharedMem.constData();
  buffer.setData((char*)sharedMem.constData(), sharedMem.size());
  buffer.open(QBuffer::ReadOnly);
  in >> text;                                     // Reading A
  sharedMem.unlock();
// As this is the last process attached to the shared memory segment
// the shared memory segment is released, destroying its contents
sharedMem.detach();