c++ - QT中如何在QShared内存中写入多个数据

标签 c++ qt

我想将 4 - 5 个变量写入 QSharedMemory,但我不知道如何读取和写入它。

我有五个不同数据类型的变量 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();

关于c++ - QT中如何在QShared内存中写入多个数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20510855/

相关文章:

c++ - 是否可以在其范围之外访问局部变量的内存?

c++ - Swift 与 Objective-C - 重用 C++ 代码

c++ - app.exec() 无法调用其他方法(静态库 Qt)

c++ - 使用CMake的Qt moc错误

c++ - 静态链接到 Qt 时加载 Qt 插件?

c++ - 使用 QSignalMapper 将 QString 传递给父级的类方法

c# - 如何在 C# 中捕获调用 C++ dll 的异常

c++ - 传递指向 API 函数的指针

c++ - 将字符串变量的值与一些文本链接起来,并将其打印到 C++ 中的标准输出

c++ - 在 Qt 中检测进程已完成