Rewrite workerscript example
authorAlan Alpert <alan.alpert@nokia.com>
Mon, 19 Mar 2012 05:34:28 +0000 (15:34 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 20 Mar 2012 04:37:59 +0000 (05:37 +0100)
Clearer function, arguable justification for using WorkerScript, and
fits better into the standrad form factor.

Change-Id: I3f29f19961a12adc29b260b3284eb620ad63bf45
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
examples/quick/threading/workerscript/Spinner.qml [new file with mode: 0644]
examples/quick/threading/workerscript/workerscript.js
examples/quick/threading/workerscript/workerscript.qml

diff --git a/examples/quick/threading/workerscript/Spinner.qml b/examples/quick/threading/workerscript/Spinner.qml
new file mode 100644 (file)
index 0000000..32ab248
--- /dev/null
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+    width: 64
+    height: 64
+    property alias value: list.currentIndex
+    property alias label: caption.text
+
+    Text {
+        id: caption
+        text: "Spinner"
+        anchors.horizontalCenter: parent.horizontalCenter
+    }
+
+    Rectangle {
+        anchors.top: caption.bottom
+        anchors.topMargin: 4
+        anchors.horizontalCenter: parent.horizontalCenter
+        height: 48
+        width: 32
+        color: "black"
+        ListView {
+            id: list
+            anchors.fill: parent
+            highlightRangeMode: ListView.StrictlyEnforceRange
+            preferredHighlightBegin: height/3
+            preferredHighlightEnd: height/3
+            clip: true
+            model: 64
+            delegate: Text {
+                font.pixelSize: 18;
+                color: "white";
+                text: index;
+                anchors.horizontalCenter: parent.horizontalCenter
+            }
+        }
+        Rectangle {
+            anchors.fill: parent
+            gradient: Gradient {
+                GradientStop { position: 0.0; color: "#FF000000" }
+                GradientStop { position: 0.2; color: "#00000000" }
+                GradientStop { position: 0.8; color: "#00000000" }
+                GradientStop { position: 1.0; color: "#FF000000" }
+            }
+        }
+    }
+}
index f76471f..ada3d82 100644 (file)
@@ -1,15 +1,24 @@
-var lastx = 0;
-var lasty = 0;
+//Will be initialized when WorkerScript{} is instantiated
+var cache = new Array(64);
+for (var i = 0; i < 64; i++)
+    cache[i] = new Array(64);
 
-WorkerScript.onMessage = function(message) {
-    var ydiff = message.y - lasty;
-    var xdiff = message.x - lastx;
-
-    var total = Math.sqrt(ydiff * ydiff + xdiff * xdiff);
-
-    lastx = message.x;
-    lasty = message.y;
+function triangle(row, column) {
+    if (cache[row][column])
+        return cache[row][column]
+    if (column < 0 || column > row)
+        return -1;
+    if (column == 0 || column == row)
+        return 1;
+    return triangle(row-1, column-1) + triangle(row-1, column);
+}
 
-    WorkerScript.sendMessage( {xmove: xdiff, ymove: ydiff, move: total} );
+WorkerScript.onMessage = function(message) {
+    //Calculate result (may take a while, using a naive algorithm)
+    var calculatedResult = triangle(message.row, message.column);
+    //Send result back to main thread
+    WorkerScript.sendMessage( { row: message.row,
+                                column: message.column,
+                                result: calculatedResult} );
 }
 
index 7fced81..640df0b 100644 (file)
 import QtQuick 2.0
 
 Rectangle {
-    width: 480; height: 320
+    width: 320; height: 480
 
     WorkerScript {
         id: myWorker
         source: "workerscript.js"
 
         onMessage: {
-            console.log("Moved " + messageObject.xmove + " along the X axis.");
-            console.log("Moved " + messageObject.ymove + " along the Y axis.");
-            console.log("Moved " + messageObject.move + " pixels.");
+            if (messageObject.row == rowSpinner.value && messageObject.column == columnSpinner.value){ //Not an old result
+                if (messageObject.result == -1)
+                    resultText.text = "Column must be <= Row";
+                else
+                    resultText.text = messageObject.result;
+            }
         }
     }
+    Row {
+        y: 24
+        spacing: 24
+        anchors.horizontalCenter: parent.horizontalCenter
+        Spinner {
+            id: rowSpinner
+            label: "Row"
+            onValueChanged: {
+                resultText.text = "Loading...";
+                myWorker.sendMessage( { row: rowSpinner.value, column: columnSpinner.value } );
+            }
+        }
 
-    Rectangle {
-        width: 200; height: 200
-        anchors.left: parent.left; anchors.leftMargin: 20
-        color: "red"
-
-        MouseArea { 
-            anchors.fill: parent
-            onClicked: myWorker.sendMessage( { rectangle: "red", x: mouse.x, y: mouse.y } );
+        Spinner {
+            id: columnSpinner
+            label: "Column"
+            onValueChanged: {
+                resultText.text = "Loading...";
+                myWorker.sendMessage( { row: rowSpinner.value, column: columnSpinner.value } );
+            }
         }
     }
 
-    Rectangle {
-        width: 200; height: 200
-        anchors.right: parent.right; anchors.rightMargin: 20
-        color: "blue"
-
-        MouseArea { 
-            anchors.fill: parent
-            onClicked: myWorker.sendMessage( { rectangle: "blue", x: mouse.x, y: mouse.y } );
-        }
+    Text {
+        id: resultText
+        y: 180
+        width: parent.width
+        horizontalAlignment: Text.AlignHCenter
+        wrapMode: Text.WordWrap
+        font.pixelSize: 32
     }
 
     Text {
-        text: "Click a Rectangle!"
+        text: "Pascal's Triangle Calculator"
         anchors { horizontalCenter: parent.horizontalCenter; bottom: parent.bottom; bottomMargin: 50 }
     }
 }