0

文字列を共有メモリに書き込む Qt 共有メモリ プログラムを作成しました。書き込み後、Boost プログラムから読み取る必要があります。簡単なプログラムで試してみたのですが、Boostインタープロセスで文字列を読み取ることができませんでした。

共有メモリに書き込む Qt コードを次に示します。そして、同じプログラムから共有メモリから読み取ることによって文字列が書き込まれるかどうかを二重にチェックしています。

void CDialog::loadString()
{
    if(sharedMemory.isAttached())
    {
        if(!sharedMemory.detach())
        {
            lbl->setText("Unable to detach from Shared Memory");
            return;
        }
    }

    lbl->setText("Click on Top Button");

    char sString[] = "my string";

    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);

    QDataStream out(&buffer);
    out << sString;

    int size = buffer.size();
    qDebug() << size;

    if(!sharedMemory.create(size))
    {
        lbl->setText("Unable to create shared memory segment");
        qDebug() << lbl->text();
    }
    sharedMemory.lock();
    char *to = (char *) sharedMemory.data();
    const char *from = buffer.data();
    memcpy(to, from, qMin(sharedMemory.size(), size));
    sharedMemory.unlock();

    char * str;
    QDataStream in(&buffer);
    sharedMemory.lock();
    buffer.setData((char *)sharedMemory.constData(), sharedMemory.size());
    buffer.open(QBuffer::ReadOnly);
    in >> str;
    sharedMemory.unlock();
    qDebug() << str;
}

そして、Qt プログラムで提供したのと同じキーを使用して、boost から読み取っています。以下はBoostプログラムコードです -

int main()
{
  boost::interprocess::shared_memory_object shdmem(boost::interprocess::open_only, "Highscore", boost::interprocess::read_only);

  boost::interprocess::offset_t size; 
  if (shdmem.get_size(size)) 
    std::cout << "Shared Mem Size: " << size << std::endl; 

  boost::interprocess::mapped_region region2(shdmem, boost::interprocess::read_only); 
  char *i2 = static_cast<char *>(region2.get_address()); 
  std::cout << i2 << std::endl;
  return 0;
}

Boostプログラムから共有メモリデータを読み取るのを手伝ってください。ありがとうございました。

4

1 に答える 1

0

Qt ドキュメントから:

警告: QSharedMemory は Qt 固有の方法でキーを変更します。したがって、現在、Qt 以外のアプリケーションの共有メモリを QSharedMemory で使用することはできません。

おそらく、両側で Boost を使用する必要があります。

于 2013-05-14T15:37:53.590 に答える