summaryrefslogtreecommitdiffstats
path: root/examples/ipc/sharedmemory
diff options
context:
space:
mode:
authoraxis <qt-info@nokia.com>2009-04-24 11:34:15 (GMT)
committeraxis <qt-info@nokia.com>2009-04-24 11:34:15 (GMT)
commit8f427b2b914d5b575a4a7c0ed65d2fb8f45acc76 (patch)
treea17e1a767a89542ab59907462206d7dcf2e504b2 /examples/ipc/sharedmemory
downloadQt-8f427b2b914d5b575a4a7c0ed65d2fb8f45acc76.zip
Qt-8f427b2b914d5b575a4a7c0ed65d2fb8f45acc76.tar.gz
Qt-8f427b2b914d5b575a4a7c0ed65d2fb8f45acc76.tar.bz2
Long live Qt for S60!
Diffstat (limited to 'examples/ipc/sharedmemory')
-rw-r--r--examples/ipc/sharedmemory/dialog.cpp189
-rw-r--r--examples/ipc/sharedmemory/dialog.h71
-rw-r--r--examples/ipc/sharedmemory/dialog.ui47
-rw-r--r--examples/ipc/sharedmemory/image.pngbin0 -> 10199 bytes
-rw-r--r--examples/ipc/sharedmemory/main.cpp54
-rw-r--r--examples/ipc/sharedmemory/qt.pngbin0 -> 2383 bytes
-rw-r--r--examples/ipc/sharedmemory/sharedmemory.pro15
7 files changed, 376 insertions, 0 deletions
diff --git a/examples/ipc/sharedmemory/dialog.cpp b/examples/ipc/sharedmemory/dialog.cpp
new file mode 100644
index 0000000..245a4a1
--- /dev/null
+++ b/examples/ipc/sharedmemory/dialog.cpp
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "dialog.h"
+#include <QFileDialog>
+#include <QBuffer>
+#include <QtCore/QDebug>
+
+/*!
+ \class Dialog
+
+ \brief This class is a simple example of how to use QSharedMemory.
+
+ It is a simple dialog that presents a few buttons. To compile the
+ example, run make in qt/examples/ipc. Then run the executable twice
+ to create two processes running the dialog. In one of the processes,
+ press the button to load an image into a shared memory segment, and
+ then select an image file to load. Once the first process has loaded
+ and displayed the image, in the second process, press the button to
+ read the same image from shared memory. The second process displays
+ the same image loaded from its new loaction in shared memory.
+*/
+
+/*!
+ The class contains a data member \l {QSharedMemory} {sharedMemory},
+ which is initialized with the key "QSharedMemoryExample" to force
+ all instances of Dialog to access the same shared memory segment.
+ The constructor also connects the clicked() signal from each of the
+ three dialog buttons to the slot function appropriate for handling
+ each button.
+*/
+//! [0]
+Dialog::Dialog(QWidget *parent)
+ : QDialog(parent), sharedMemory("QSharedMemoryExample")
+{
+ ui.setupUi(this);
+ connect(ui.loadFromFileButton, SIGNAL(clicked()), SLOT(loadFromFile()));
+ connect(ui.loadFromSharedMemoryButton,
+ SIGNAL(clicked()),
+ SLOT(loadFromMemory()));
+ setWindowTitle(tr("SharedMemory Example"));
+}
+//! [0]
+
+/*!
+ This slot function is called when the \tt {Load Image From File...}
+ button is pressed on the firs Dialog process. First, it tests
+ whether the process is already connected to a shared memory segment
+ and, if so, detaches from that segment. This ensures that we always
+ start the example from the beginning if we run it multiple times
+ with the same two Dialog processes. After detaching from an existing
+ shared memory segment, the user is prompted to select an image file.
+ The selected file is loaded into a QImage. The QImage is displayed
+ in the Dialog and streamed into a QBuffer with a QDataStream.
+
+ Next, it gets a new shared memory segment from the system big enough
+ to hold the image data in the QBuffer, and it locks the segment to
+ prevent the second Dialog process from accessing it. Then it copies
+ the image from the QBuffer into the shared memory segment. Finally,
+ it unlocks the shared memory segment so the second Dialog process
+ can access it.
+
+ After this function runs, the user is expected to press the \tt
+ {Load Image from Shared Memory} button on the second Dialog process.
+
+ \sa loadFromMemory()
+ */
+//! [1]
+void Dialog::loadFromFile()
+{
+ if (sharedMemory.isAttached())
+ detach();
+
+ ui.label->setText(tr("Select an image file"));
+ QString fileName = QFileDialog::getOpenFileName(0, QString(), QString(),
+ tr("Images (*.png *.xpm *.jpg)"));
+ QImage image;
+ if (!image.load(fileName)) {
+ ui.label->setText(tr("Selected file is not an image, please select another."));
+ return;
+ }
+ ui.label->setPixmap(QPixmap::fromImage(image));
+//! [1] //! [2]
+
+ // load into shared memory
+ QBuffer buffer;
+ buffer.open(QBuffer::ReadWrite);
+ QDataStream out(&buffer);
+ out << image;
+ int size = buffer.size();
+
+ if (!sharedMemory.create(size)) {
+ ui.label->setText(tr("Unable to create shared memory segment."));
+ return;
+ }
+ sharedMemory.lock();
+ char *to = (char*)sharedMemory.data();
+ const char *from = buffer.data().data();
+ memcpy(to, from, qMin(sharedMemory.size(), size));
+ sharedMemory.unlock();
+}
+//! [2]
+
+/*!
+ This slot function is called in the second Dialog process, when the
+ user presses the \tt {Load Image from Shared Memory} button. First,
+ it attaches the process to the shared memory segment created by the
+ first Dialog process. Then it locks the segment for exclusive
+ access, copies the image data from the segment into a QBuffer, and
+ streams the QBuffer into a QImage. Then it unlocks the shared memory
+ segment, detaches from it, and finally displays the QImage in the
+ Dialog.
+
+ \sa loadFromFile()
+ */
+//! [3]
+void Dialog::loadFromMemory()
+{
+ if (!sharedMemory.attach()) {
+ ui.label->setText(tr("Unable to attach to shared memory segment.\n" \
+ "Load an image first."));
+ return;
+ }
+
+ QBuffer buffer;
+ QDataStream in(&buffer);
+ QImage image;
+
+ sharedMemory.lock();
+ buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
+ buffer.open(QBuffer::ReadOnly);
+ in >> image;
+ sharedMemory.unlock();
+
+ sharedMemory.detach();
+ ui.label->setPixmap(QPixmap::fromImage(image));
+}
+//! [3]
+
+/*!
+ This private function is called by the destructor to detach the
+ process from its shared memory segment. When the last process
+ detaches from a shared memory segment, the system releases the
+ shared memory.
+ */
+void Dialog::detach()
+{
+ if (!sharedMemory.detach())
+ ui.label->setText(tr("Unable to detach from shared memory."));
+}
+
diff --git a/examples/ipc/sharedmemory/dialog.h b/examples/ipc/sharedmemory/dialog.h
new file mode 100644
index 0000000..a0c84b6
--- /dev/null
+++ b/examples/ipc/sharedmemory/dialog.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DIALOG_H
+#define DIALOG_H
+
+#include <qdialog.h>
+#include <qsharedmemory.h>
+#include "ui_dialog.h"
+
+//! [0]
+class Dialog : public QDialog
+{
+ Q_OBJECT
+
+ public:
+ Dialog(QWidget *parent = 0);
+
+ public slots:
+ void loadFromFile();
+ void loadFromMemory();
+
+ private:
+ void detach();
+
+ private:
+ Ui::Dialog ui;
+ QSharedMemory sharedMemory;
+};
+//! [0]
+
+#endif
+
diff --git a/examples/ipc/sharedmemory/dialog.ui b/examples/ipc/sharedmemory/dialog.ui
new file mode 100644
index 0000000..e99d6fb
--- /dev/null
+++ b/examples/ipc/sharedmemory/dialog.ui
@@ -0,0 +1,47 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>451</width>
+ <height>322</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Dialog</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QPushButton" name="loadFromFileButton" >
+ <property name="text" >
+ <string>Load Image From File...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Launch two of these dialogs. In the first, press the top button and load an image from a file. In the second, press the bottom button and display the loaded image from shared memory.</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QPushButton" name="loadFromSharedMemoryButton" >
+ <property name="text" >
+ <string>Display Image From Shared Memory</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/examples/ipc/sharedmemory/image.png b/examples/ipc/sharedmemory/image.png
new file mode 100644
index 0000000..dd93453
--- /dev/null
+++ b/examples/ipc/sharedmemory/image.png
Binary files differ
diff --git a/examples/ipc/sharedmemory/main.cpp b/examples/ipc/sharedmemory/main.cpp
new file mode 100644
index 0000000..533efeb
--- /dev/null
+++ b/examples/ipc/sharedmemory/main.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QApplication>
+#include "dialog.h"
+
+//! [0]
+int main(int argc, char *argv[])
+{
+ QApplication application(argc, argv);
+ Dialog dialog;
+ dialog.show();
+ return application.exec();
+}
+//! [0]
+
diff --git a/examples/ipc/sharedmemory/qt.png b/examples/ipc/sharedmemory/qt.png
new file mode 100644
index 0000000..60ef558
--- /dev/null
+++ b/examples/ipc/sharedmemory/qt.png
Binary files differ
diff --git a/examples/ipc/sharedmemory/sharedmemory.pro b/examples/ipc/sharedmemory/sharedmemory.pro
new file mode 100644
index 0000000..4dad1d1
--- /dev/null
+++ b/examples/ipc/sharedmemory/sharedmemory.pro
@@ -0,0 +1,15 @@
+SOURCES += main.cpp \
+ dialog.cpp
+
+HEADERS += dialog.h
+
+# Forms and resources
+FORMS += dialog.ui
+
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/ipc/sharedmemory
+sources.files = $$SOURCES $$HEADERS $$FORMS $$RESOURCES *.pro *.png
+sources.path = $$[QT_INSTALL_EXAMPLES]/ipc/sharedmemory
+INSTALLS += target sources
+
+include($$QT_SOURCE_TREE/examples/examplebase.pri)