diff options
Diffstat (limited to 'examples/threads')
20 files changed, 1692 insertions, 0 deletions
diff --git a/examples/threads/README b/examples/threads/README new file mode 100644 index 0000000..e4b426f --- /dev/null +++ b/examples/threads/README @@ -0,0 +1,40 @@ +Qt 4 makes it easier than ever to write multithreaded applications. More +classes have been made usable from non-GUI threads, and the signals and slots +mechanism can now be used to communicate between threads. + +Additionally, it is now possible to move objects between threads. + + +The example launcher provided with Qt can be used to explore each of the +examples in this directory. + +Documentation for these examples can be found via the Tutorial and Examples +link in the main Qt documentation. + + +Finding the Qt Examples and Demos launcher +========================================== + +On Windows: + +The launcher can be accessed via the Windows Start menu. Select the menu +entry entitled "Qt Examples and Demos" entry in the submenu containing +the Qt tools. + +On Mac OS X: + +For the binary distribution, the qtdemo executable is installed in the +/Developer/Applications/Qt directory. For the source distribution, it is +installed alongside the other Qt tools on the path specified when Qt is +configured. + +On Unix/Linux: + +The qtdemo executable is installed alongside the other Qt tools on the path +specified when Qt is configured. + +On all platforms: + +The source code for the launcher can be found in the demos/qtdemo directory +in the Qt package. This example is built at the same time as the Qt libraries, +tools, examples, and demonstrations. diff --git a/examples/threads/mandelbrot/main.cpp b/examples/threads/mandelbrot/main.cpp new file mode 100644 index 0000000..2395ff6 --- /dev/null +++ b/examples/threads/mandelbrot/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 "mandelbrotwidget.h" + +//! [0] +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + MandelbrotWidget widget; + widget.show(); + return app.exec(); +} +//! [0] diff --git a/examples/threads/mandelbrot/mandelbrot.pro b/examples/threads/mandelbrot/mandelbrot.pro new file mode 100644 index 0000000..437f449 --- /dev/null +++ b/examples/threads/mandelbrot/mandelbrot.pro @@ -0,0 +1,13 @@ +HEADERS = mandelbrotwidget.h \ + renderthread.h +SOURCES = main.cpp \ + mandelbrotwidget.cpp \ + renderthread.cpp + +unix:!mac:LIBS += -lm + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/threads/mandelbrot +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS mandelbrot.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/threads/mandelbrot +INSTALLS += target sources diff --git a/examples/threads/mandelbrot/mandelbrotwidget.cpp b/examples/threads/mandelbrot/mandelbrotwidget.cpp new file mode 100644 index 0000000..74b27d8 --- /dev/null +++ b/examples/threads/mandelbrot/mandelbrotwidget.cpp @@ -0,0 +1,240 @@ +/**************************************************************************** +** +** 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 <QtGui> + +#include <math.h> + +#include "mandelbrotwidget.h" + +//! [0] +const double DefaultCenterX = -0.637011f; +const double DefaultCenterY = -0.0395159f; +const double DefaultScale = 0.00403897f; + +const double ZoomInFactor = 0.8f; +const double ZoomOutFactor = 1 / ZoomInFactor; +const int ScrollStep = 20; +//! [0] + +//! [1] +MandelbrotWidget::MandelbrotWidget(QWidget *parent) + : QWidget(parent) +{ + centerX = DefaultCenterX; + centerY = DefaultCenterY; + pixmapScale = DefaultScale; + curScale = DefaultScale; + + qRegisterMetaType<QImage>("QImage"); + connect(&thread, SIGNAL(renderedImage(const QImage &, double)), + this, SLOT(updatePixmap(const QImage &, double))); + + setWindowTitle(tr("Mandelbrot")); +#ifndef QT_NO_CURSOR + setCursor(Qt::CrossCursor); +#endif + resize(550, 400); +} +//! [1] + +//! [2] +void MandelbrotWidget::paintEvent(QPaintEvent * /* event */) +{ + QPainter painter(this); + painter.fillRect(rect(), Qt::black); + + if (pixmap.isNull()) { + painter.setPen(Qt::white); + painter.drawText(rect(), Qt::AlignCenter, + tr("Rendering initial image, please wait...")); +//! [2] //! [3] + return; +//! [3] //! [4] + } +//! [4] + +//! [5] + if (curScale == pixmapScale) { +//! [5] //! [6] + painter.drawPixmap(pixmapOffset, pixmap); +//! [6] //! [7] + } else { +//! [7] //! [8] + double scaleFactor = pixmapScale / curScale; + int newWidth = int(pixmap.width() * scaleFactor); + int newHeight = int(pixmap.height() * scaleFactor); + int newX = pixmapOffset.x() + (pixmap.width() - newWidth) / 2; + int newY = pixmapOffset.y() + (pixmap.height() - newHeight) / 2; + + painter.save(); + painter.translate(newX, newY); + painter.scale(scaleFactor, scaleFactor); + QRectF exposed = painter.matrix().inverted().mapRect(rect()).adjusted(-1, -1, 1, 1); + painter.drawPixmap(exposed, pixmap, exposed); + painter.restore(); + } +//! [8] //! [9] + + QString text = tr("Use mouse wheel or the '+' and '-' keys to zoom. " + "Press and hold left mouse button to scroll."); + QFontMetrics metrics = painter.fontMetrics(); + int textWidth = metrics.width(text); + + painter.setPen(Qt::NoPen); + painter.setBrush(QColor(0, 0, 0, 127)); + painter.drawRect((width() - textWidth) / 2 - 5, 0, textWidth + 10, + metrics.lineSpacing() + 5); + painter.setPen(Qt::white); + painter.drawText((width() - textWidth) / 2, + metrics.leading() + metrics.ascent(), text); +} +//! [9] + +//! [10] +void MandelbrotWidget::resizeEvent(QResizeEvent * /* event */) +{ + thread.render(centerX, centerY, curScale, size()); +} +//! [10] + +//! [11] +void MandelbrotWidget::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Plus: + zoom(ZoomInFactor); + break; + case Qt::Key_Minus: + zoom(ZoomOutFactor); + break; + case Qt::Key_Left: + scroll(-ScrollStep, 0); + break; + case Qt::Key_Right: + scroll(+ScrollStep, 0); + break; + case Qt::Key_Down: + scroll(0, -ScrollStep); + break; + case Qt::Key_Up: + scroll(0, +ScrollStep); + break; + default: + QWidget::keyPressEvent(event); + } +} +//! [11] + +//! [12] +void MandelbrotWidget::wheelEvent(QWheelEvent *event) +{ + int numDegrees = event->delta() / 8; + double numSteps = numDegrees / 15.0f; + zoom(pow(ZoomInFactor, numSteps)); +} +//! [12] + +//! [13] +void MandelbrotWidget::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + lastDragPos = event->pos(); +} +//! [13] + +//! [14] +void MandelbrotWidget::mouseMoveEvent(QMouseEvent *event) +{ + if (event->buttons() & Qt::LeftButton) { + pixmapOffset += event->pos() - lastDragPos; + lastDragPos = event->pos(); + update(); + } +} +//! [14] + +//! [15] +void MandelbrotWidget::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + pixmapOffset += event->pos() - lastDragPos; + lastDragPos = QPoint(); + + int deltaX = (width() - pixmap.width()) / 2 - pixmapOffset.x(); + int deltaY = (height() - pixmap.height()) / 2 - pixmapOffset.y(); + scroll(deltaX, deltaY); + } +} +//! [15] + +//! [16] +void MandelbrotWidget::updatePixmap(const QImage &image, double scaleFactor) +{ + if (!lastDragPos.isNull()) + return; + + pixmap = QPixmap::fromImage(image); + pixmapOffset = QPoint(); + lastDragPos = QPoint(); + pixmapScale = scaleFactor; + update(); +} +//! [16] + +//! [17] +void MandelbrotWidget::zoom(double zoomFactor) +{ + curScale *= zoomFactor; + update(); + thread.render(centerX, centerY, curScale, size()); +} +//! [17] + +//! [18] +void MandelbrotWidget::scroll(int deltaX, int deltaY) +{ + centerX += deltaX * curScale; + centerY += deltaY * curScale; + update(); + thread.render(centerX, centerY, curScale, size()); +} +//! [18] diff --git a/examples/threads/mandelbrot/mandelbrotwidget.h b/examples/threads/mandelbrot/mandelbrotwidget.h new file mode 100644 index 0000000..3e8084c --- /dev/null +++ b/examples/threads/mandelbrot/mandelbrotwidget.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** 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 MANDELBROTWIDGET_H +#define MANDELBROTWIDGET_H + +#include <QPixmap> +#include <QWidget> + +#include "renderthread.h" + +//! [0] +class MandelbrotWidget : public QWidget +{ + Q_OBJECT + +public: + MandelbrotWidget(QWidget *parent = 0); + +protected: + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + void keyPressEvent(QKeyEvent *event); + void wheelEvent(QWheelEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +private slots: + void updatePixmap(const QImage &image, double scaleFactor); + +private: + void zoom(double zoomFactor); + void scroll(int deltaX, int deltaY); + + RenderThread thread; + QPixmap pixmap; + QPoint pixmapOffset; + QPoint lastDragPos; + double centerX; + double centerY; + double pixmapScale; + double curScale; +}; +//! [0] + +#endif diff --git a/examples/threads/mandelbrot/renderthread.cpp b/examples/threads/mandelbrot/renderthread.cpp new file mode 100644 index 0000000..5879035 --- /dev/null +++ b/examples/threads/mandelbrot/renderthread.cpp @@ -0,0 +1,216 @@ +/**************************************************************************** +** +** 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 <QtGui> + +#include <math.h> + +#include "renderthread.h" + +//! [0] +RenderThread::RenderThread(QObject *parent) + : QThread(parent) +{ + restart = false; + abort = false; + + for (int i = 0; i < ColormapSize; ++i) + colormap[i] = rgbFromWaveLength(380.0 + (i * 400.0 / ColormapSize)); +} +//! [0] + +//! [1] +RenderThread::~RenderThread() +{ + mutex.lock(); + abort = true; + condition.wakeOne(); + mutex.unlock(); + + wait(); +} +//! [1] + +//! [2] +void RenderThread::render(double centerX, double centerY, double scaleFactor, + QSize resultSize) +{ + QMutexLocker locker(&mutex); + + this->centerX = centerX; + this->centerY = centerY; + this->scaleFactor = scaleFactor; + this->resultSize = resultSize; + + if (!isRunning()) { + start(LowPriority); + } else { + restart = true; + condition.wakeOne(); + } +} +//! [2] + +//! [3] +void RenderThread::run() +{ + forever { + mutex.lock(); + QSize resultSize = this->resultSize; + double scaleFactor = this->scaleFactor; + double centerX = this->centerX; + double centerY = this->centerY; + mutex.unlock(); +//! [3] + +//! [4] + int halfWidth = resultSize.width() / 2; +//! [4] //! [5] + int halfHeight = resultSize.height() / 2; + QImage image(resultSize, QImage::Format_RGB32); + + const int NumPasses = 8; + int pass = 0; + while (pass < NumPasses) { + const int MaxIterations = (1 << (2 * pass + 6)) + 32; + const int Limit = 4; + bool allBlack = true; + + for (int y = -halfHeight; y < halfHeight; ++y) { + if (restart) + break; + if (abort) + return; + + uint *scanLine = + reinterpret_cast<uint *>(image.scanLine(y + halfHeight)); + double ay = centerY + (y * scaleFactor); + + for (int x = -halfWidth; x < halfWidth; ++x) { + double ax = centerX + (x * scaleFactor); + double a1 = ax; + double b1 = ay; + int numIterations = 0; + + do { + ++numIterations; + double a2 = (a1 * a1) - (b1 * b1) + ax; + double b2 = (2 * a1 * b1) + ay; + if ((a2 * a2) + (b2 * b2) > Limit) + break; + + ++numIterations; + a1 = (a2 * a2) - (b2 * b2) + ax; + b1 = (2 * a2 * b2) + ay; + if ((a1 * a1) + (b1 * b1) > Limit) + break; + } while (numIterations < MaxIterations); + + if (numIterations < MaxIterations) { + *scanLine++ = colormap[numIterations % ColormapSize]; + allBlack = false; + } else { + *scanLine++ = qRgb(0, 0, 0); + } + } + } + + if (allBlack && pass == 0) { + pass = 4; + } else { + if (!restart) + emit renderedImage(image, scaleFactor); +//! [5] //! [6] + ++pass; + } +//! [6] //! [7] + } +//! [7] + +//! [8] + mutex.lock(); +//! [8] //! [9] + if (!restart) + condition.wait(&mutex); + restart = false; + mutex.unlock(); + } +} +//! [9] + +//! [10] +uint RenderThread::rgbFromWaveLength(double wave) +{ + double r = 0.0; + double g = 0.0; + double b = 0.0; + + if (wave >= 380.0 && wave <= 440.0) { + r = -1.0 * (wave - 440.0) / (440.0 - 380.0); + b = 1.0; + } else if (wave >= 440.0 && wave <= 490.0) { + g = (wave - 440.0) / (490.0 - 440.0); + b = 1.0; + } else if (wave >= 490.0 && wave <= 510.0) { + g = 1.0; + b = -1.0 * (wave - 510.0) / (510.0 - 490.0); + } else if (wave >= 510.0 && wave <= 580.0) { + r = (wave - 510.0) / (580.0 - 510.0); + g = 1.0; + } else if (wave >= 580.0 && wave <= 645.0) { + r = 1.0; + g = -1.0 * (wave - 645.0) / (645.0 - 580.0); + } else if (wave >= 645.0 && wave <= 780.0) { + r = 1.0; + } + + double s = 1.0; + if (wave > 700.0) + s = 0.3 + 0.7 * (780.0 - wave) / (780.0 - 700.0); + else if (wave < 420.0) + s = 0.3 + 0.7 * (wave - 380.0) / (420.0 - 380.0); + + r = pow(r * s, 0.8); + g = pow(g * s, 0.8); + b = pow(b * s, 0.8); + return qRgb(int(r * 255), int(g * 255), int(b * 255)); +} +//! [10] diff --git a/examples/threads/mandelbrot/renderthread.h b/examples/threads/mandelbrot/renderthread.h new file mode 100644 index 0000000..2b03186 --- /dev/null +++ b/examples/threads/mandelbrot/renderthread.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** 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 RENDERTHREAD_H +#define RENDERTHREAD_H + +#include <QMutex> +#include <QSize> +#include <QThread> +#include <QWaitCondition> + +QT_BEGIN_NAMESPACE +class QImage; +QT_END_NAMESPACE + +//! [0] +class RenderThread : public QThread +{ + Q_OBJECT + +public: + RenderThread(QObject *parent = 0); + ~RenderThread(); + + void render(double centerX, double centerY, double scaleFactor, + QSize resultSize); + +signals: + void renderedImage(const QImage &image, double scaleFactor); + +protected: + void run(); + +private: + uint rgbFromWaveLength(double wave); + + QMutex mutex; + QWaitCondition condition; + double centerX; + double centerY; + double scaleFactor; + QSize resultSize; + bool restart; + bool abort; + + enum { ColormapSize = 512 }; + uint colormap[ColormapSize]; +}; +//! [0] + +#endif diff --git a/examples/threads/queuedcustomtype/block.cpp b/examples/threads/queuedcustomtype/block.cpp new file mode 100644 index 0000000..1a14f09 --- /dev/null +++ b/examples/threads/queuedcustomtype/block.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** 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 <QColor> +#include <QRect> +#include "block.h" + +Block::Block() +{ +} + +Block::Block(const Block &other) +{ + m_rect = other.m_rect; + m_color = other.m_color; +} + +Block::~Block() +{ +} + +Block::Block(const QRect &rect, const QColor &color) +{ + m_rect = rect; + m_color = color; +} + +QColor Block::color() const +{ + return m_color; +} + +QRect Block::rect() const +{ + return m_rect; +} diff --git a/examples/threads/queuedcustomtype/block.h b/examples/threads/queuedcustomtype/block.h new file mode 100644 index 0000000..2a75529 --- /dev/null +++ b/examples/threads/queuedcustomtype/block.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 BLOCK_H +#define BLOCK_H + +#include <QColor> +#include <QDebug> +#include <QMetaType> +#include <QRect> + +//! [custom type definition and meta-type declaration] +class Block +{ +public: + Block(); + Block(const Block &other); + ~Block(); + + Block(const QRect &rect, const QColor &color); + + QColor color() const; + QRect rect() const; + +private: + QRect m_rect; + QColor m_color; +}; + +Q_DECLARE_METATYPE(Block); +//! [custom type definition and meta-type declaration] + +#endif diff --git a/examples/threads/queuedcustomtype/main.cpp b/examples/threads/queuedcustomtype/main.cpp new file mode 100644 index 0000000..93dab49 --- /dev/null +++ b/examples/threads/queuedcustomtype/main.cpp @@ -0,0 +1,129 @@ +/**************************************************************************** +** +** 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 <QPainter> +#include <QTime> +#include "block.h" +#include "window.h" + +QImage createImage(int width, int height) +{ + QImage image(width, height, QImage::Format_RGB16); + QPainter painter; + QPen pen; + pen.setStyle(Qt::NoPen); + QBrush brush(Qt::blue); + + painter.begin(&image); + painter.fillRect(image.rect(), brush); + brush.setColor(Qt::white); + painter.setPen(pen); + painter.setBrush(brush); + + static const QPointF points1[3] = { + QPointF(4, 4), + QPointF(7, 4), + QPointF(5.5, 1) + }; + + static const QPointF points2[3] = { + QPointF(1, 4), + QPointF(7, 4), + QPointF(10, 10) + }; + + static const QPointF points3[3] = { + QPointF(4, 4), + QPointF(10, 4), + QPointF(1, 10) + }; + + painter.setWindow(0, 0, 10, 10); + + int x = 0; + int y = 0; + int starWidth = image.width()/3; + int starHeight = image.height()/3; + + QRect rect(x, y, starWidth, starHeight); + + for (int i = 0; i < 9; ++i) { + + painter.setViewport(rect); + painter.drawPolygon(points1, 3); + painter.drawPolygon(points2, 3); + painter.drawPolygon(points3, 3); + + if (i % 3 == 2) { + y = y + starHeight; + rect.moveTop(y); + + x = 0; + rect.moveLeft(x); + + } else { + x = x + starWidth; + rect.moveLeft(x); + } + } + + painter.end(); + return image; +} + +//! [main function] //! [main start] +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); +//! [main start] //! [register meta-type for queued communications] + qRegisterMetaType<Block>(); +//! [register meta-type for queued communications] + qsrand(QTime::currentTime().elapsed()); + + Window window; + window.show(); + + window.loadImage(createImage(256, 256)); +//! [main finish] + return app.exec(); +} +//! [main finish] //! [main function] diff --git a/examples/threads/queuedcustomtype/queuedcustomtype.pro b/examples/threads/queuedcustomtype/queuedcustomtype.pro new file mode 100644 index 0000000..6f39121 --- /dev/null +++ b/examples/threads/queuedcustomtype/queuedcustomtype.pro @@ -0,0 +1,7 @@ +HEADERS = block.h \ + renderthread.h \ + window.h +SOURCES = main.cpp \ + block.cpp \ + renderthread.cpp \ + window.cpp diff --git a/examples/threads/queuedcustomtype/renderthread.cpp b/examples/threads/queuedcustomtype/renderthread.cpp new file mode 100644 index 0000000..052dd39 --- /dev/null +++ b/examples/threads/queuedcustomtype/renderthread.cpp @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** 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 "renderthread.h" + +RenderThread::RenderThread(QObject *parent) + : QThread(parent) +{ + m_abort = false; +} + +RenderThread::~RenderThread() +{ + mutex.lock(); + m_abort = true; + mutex.unlock(); + + wait(); +} + +//![processing the image (start)] +void RenderThread::processImage(const QImage &image) +{ + if (image.isNull()) + return; + + m_image = image; + m_abort = false; + start(); +} + +void RenderThread::run() +{ + int size = qMax(m_image.width()/20, m_image.height()/20); + for (int s = size; s > 0; --s) { + for (int c = 0; c < 400; ++c) { +//![processing the image (start)] + int x1 = qMax(0, (qrand() % m_image.width()) - s/2); + int x2 = qMin(x1 + s/2 + 1, m_image.width()); + int y1 = qMax(0, (qrand() % m_image.height()) - s/2); + int y2 = qMin(y1 + s/2 + 1, m_image.height()); + int n = 0; + int red = 0; + int green = 0; + int blue = 0; + for (int i = y1; i < y2; ++i) { + for (int j = x1; j < x2; ++j) { + QRgb pixel = m_image.pixel(j, i); + red += qRed(pixel); + green += qGreen(pixel); + blue += qBlue(pixel); + n += 1; + } + } +//![processing the image (finish)] + Block block(QRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1), + QColor(red/n, green/n, blue/n)); + emit sendBlock(block); + if (m_abort) + return; + msleep(10); + } + } +} +//![processing the image (finish)] + +void RenderThread::stopProcess() +{ + mutex.lock(); + m_abort = true; + mutex.unlock(); +} diff --git a/examples/threads/queuedcustomtype/renderthread.h b/examples/threads/queuedcustomtype/renderthread.h new file mode 100644 index 0000000..9c7f049 --- /dev/null +++ b/examples/threads/queuedcustomtype/renderthread.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** 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 RENDERTHREAD_H +#define RENDERTHREAD_H + +#include <QImage> +#include <QMutex> +#include <QThread> +#include "block.h" + +//! [RenderThread class definition] +class RenderThread : public QThread +{ + Q_OBJECT + +public: + RenderThread(QObject *parent = 0); + ~RenderThread(); + + void processImage(const QImage &image); + +signals: + void sendBlock(const Block &block); + +public slots: + void stopProcess(); + +protected: + void run(); + +private: + bool m_abort; + QImage m_image; + QMutex mutex; +}; +//! [RenderThread class definition] + +#endif diff --git a/examples/threads/queuedcustomtype/window.cpp b/examples/threads/queuedcustomtype/window.cpp new file mode 100644 index 0000000..7282e0c --- /dev/null +++ b/examples/threads/queuedcustomtype/window.cpp @@ -0,0 +1,137 @@ +/**************************************************************************** +** +** 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 <QtGui> +#include "window.h" + +//! [Window constructor start] +Window::Window() +{ + thread = new RenderThread(); +//! [Window constructor start] //! [set up widgets and connections] + + label = new QLabel(); + label->setAlignment(Qt::AlignCenter); + + loadButton = new QPushButton(tr("&Load image...")); + resetButton = new QPushButton(tr("&Stop")); + resetButton->setEnabled(false); + + connect(loadButton, SIGNAL(clicked()), this, SLOT(loadImage())); + connect(resetButton, SIGNAL(clicked()), thread, SLOT(stopProcess())); + connect(thread, SIGNAL(finished()), this, SLOT(resetUi())); +//! [set up widgets and connections] //! [connecting signal with custom type] + connect(thread, SIGNAL(sendBlock(Block)), this, SLOT(addBlock(Block))); +//! [connecting signal with custom type] + + QHBoxLayout *buttonLayout = new QHBoxLayout(); + buttonLayout->addStretch(); + buttonLayout->addWidget(loadButton); + buttonLayout->addWidget(resetButton); + buttonLayout->addStretch(); + + QVBoxLayout *layout = new QVBoxLayout(this); + layout->addWidget(label); + layout->addLayout(buttonLayout); + +//! [Window constructor finish] + setWindowTitle(tr("Queued Custom Type")); +} +//! [Window constructor finish] + +void Window::loadImage() +{ + QStringList formats; + foreach (QByteArray format, QImageReader::supportedImageFormats()) + if (format.toLower() == format) + formats.append("*." + format); + + QString newPath = QFileDialog::getOpenFileName(this, tr("Open Image"), + path, tr("Image files (%1)").arg(formats.join(" "))); + + if (newPath.isEmpty()) + return; + + QImage image(newPath); + if (!image.isNull()) { + loadImage(image); + path = newPath; + } +} + +void Window::loadImage(const QImage &image) +{ + QDesktopWidget desktop; + QImage useImage; + QRect space = desktop.availableGeometry(); + if (image.width() > 0.75*space.width() || image.height() > 0.75*space.height()) + useImage = image.scaled(0.75*space.width(), 0.75*space.height(), + Qt::KeepAspectRatio, Qt::SmoothTransformation); + else + useImage = image; + + pixmap = QPixmap(useImage.width(), useImage.height()); + pixmap.fill(qRgb(255, 255, 255)); + label->setPixmap(pixmap); + loadButton->setEnabled(false); + resetButton->setEnabled(true); + thread->processImage(useImage); +} + +//! [Adding blocks to the display] +void Window::addBlock(const Block &block) +{ + QColor color = block.color(); + color.setAlpha(64); + + QPainter painter; + painter.begin(&pixmap); + painter.fillRect(block.rect(), color); + painter.end(); + label->setPixmap(pixmap); +} +//! [Adding blocks to the display] + +void Window::resetUi() +{ + loadButton->setEnabled(true); + resetButton->setEnabled(false); +} diff --git a/examples/threads/queuedcustomtype/window.h b/examples/threads/queuedcustomtype/window.h new file mode 100644 index 0000000..c0ed280 --- /dev/null +++ b/examples/threads/queuedcustomtype/window.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** 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 WINDOW_H +#define WINDOW_H + +#include <QWidget> +#include "renderthread.h" + +class QLabel; +class QPushButton; + +//! [Window class definition] +class Window : public QWidget +{ + Q_OBJECT + +public: + Window(); + void loadImage(const QImage &image); + +public slots: + void addBlock(const Block &block); + +private slots: + void loadImage(); + void resetUi(); + +private: + QLabel *label; + QPixmap pixmap; + QPushButton *loadButton; + QPushButton *resetButton; + QString path; + RenderThread *thread; +}; +//! [Window class definition] + +#endif diff --git a/examples/threads/semaphores/semaphores.cpp b/examples/threads/semaphores/semaphores.cpp new file mode 100644 index 0000000..548380d --- /dev/null +++ b/examples/threads/semaphores/semaphores.cpp @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** 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 <QtCore> + +#include <stdio.h> +#include <stdlib.h> + +//! [0] +const int DataSize = 100000; +const int BufferSize = 8192; +char buffer[BufferSize]; + +QSemaphore freeBytes(BufferSize); +QSemaphore usedBytes; +//! [0] + +//! [1] +class Producer : public QThread +//! [1] //! [2] +{ +public: + void run(); +}; + +void Producer::run() +{ + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + for (int i = 0; i < DataSize; ++i) { + freeBytes.acquire(); + buffer[i % BufferSize] = "ACGT"[(int)qrand() % 4]; + usedBytes.release(); + } +} +//! [2] + +//! [3] +class Consumer : public QThread +//! [3] //! [4] +{ +public: + void run(); +}; + +void Consumer::run() +{ + for (int i = 0; i < DataSize; ++i) { + usedBytes.acquire(); + fprintf(stderr, "%c", buffer[i % BufferSize]); + freeBytes.release(); + } + fprintf(stderr, "\n"); +} +//! [4] + +//! [5] +int main(int argc, char *argv[]) +//! [5] //! [6] +{ + QCoreApplication app(argc, argv); + Producer producer; + Consumer consumer; + producer.start(); + consumer.start(); + producer.wait(); + consumer.wait(); + return 0; +} +//! [6] diff --git a/examples/threads/semaphores/semaphores.pro b/examples/threads/semaphores/semaphores.pro new file mode 100644 index 0000000..2e468b7 --- /dev/null +++ b/examples/threads/semaphores/semaphores.pro @@ -0,0 +1,10 @@ +SOURCES += semaphores.cpp +QT = core +CONFIG -= app_bundle +CONFIG += console + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/threads/semaphores +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS semaphores.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/threads/semaphores +INSTALLS += target sources diff --git a/examples/threads/threads.pro b/examples/threads/threads.pro new file mode 100644 index 0000000..a2ccfa7 --- /dev/null +++ b/examples/threads/threads.pro @@ -0,0 +1,10 @@ +TEMPLATE = subdirs +SUBDIRS = mandelbrot \ + semaphores \ + waitconditions + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/threads +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS threads.pro README +sources.path = $$[QT_INSTALL_EXAMPLES]/threads +INSTALLS += target sources diff --git a/examples/threads/waitconditions/waitconditions.cpp b/examples/threads/waitconditions/waitconditions.cpp new file mode 100644 index 0000000..44188d5 --- /dev/null +++ b/examples/threads/waitconditions/waitconditions.cpp @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** 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 <QtCore> + +#include <stdio.h> +#include <stdlib.h> + +//! [0] +const int DataSize = 100000; +const int BufferSize = 8192; +char buffer[BufferSize]; + +QWaitCondition bufferNotEmpty; +QWaitCondition bufferNotFull; +QMutex mutex; +int numUsedBytes = 0; +//! [0] + +//! [1] +class Producer : public QThread +//! [1] //! [2] +{ +public: + void run(); +}; + +void Producer::run() +{ + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + + for (int i = 0; i < DataSize; ++i) { + mutex.lock(); + if (numUsedBytes == BufferSize) + bufferNotFull.wait(&mutex); + mutex.unlock(); + + buffer[i % BufferSize] = "ACGT"[(int)qrand() % 4]; + + mutex.lock(); + ++numUsedBytes; + bufferNotEmpty.wakeAll(); + mutex.unlock(); + } +} +//! [2] + +//! [3] +class Consumer : public QThread +//! [3] //! [4] +{ +public: + void run(); +}; + +void Consumer::run() +{ + for (int i = 0; i < DataSize; ++i) { + mutex.lock(); + if (numUsedBytes == 0) + bufferNotEmpty.wait(&mutex); + mutex.unlock(); + + fprintf(stderr, "%c", buffer[i % BufferSize]); + + mutex.lock(); + --numUsedBytes; + bufferNotFull.wakeAll(); + mutex.unlock(); + } + fprintf(stderr, "\n"); +} +//! [4] + +//! [5] +int main(int argc, char *argv[]) +//! [5] //! [6] +{ + QCoreApplication app(argc, argv); + Producer producer; + Consumer consumer; + producer.start(); + consumer.start(); + producer.wait(); + consumer.wait(); + return 0; +} +//! [6] diff --git a/examples/threads/waitconditions/waitconditions.pro b/examples/threads/waitconditions/waitconditions.pro new file mode 100644 index 0000000..8c34cec --- /dev/null +++ b/examples/threads/waitconditions/waitconditions.pro @@ -0,0 +1,20 @@ +###################################################################### +# Automatically generated by qmake (1.08a) Fri Jan 7 15:25:07 2005 +###################################################################### + +TEMPLATE = app +CONFIG -= moc app_bundle +DEPENDPATH += . +INCLUDEPATH += . + +# Input +SOURCES += waitconditions.cpp +CONFIG += qt warn_on create_prl link_prl console +OBJECTS_DIR=.obj/debug-shared +MOC_DIR=.moc/debug-shared + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/threads/waitconditions +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS waitconditions.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/threads/waitconditions +INSTALLS += target sources |