chiark / gitweb /
Fix race conditions.
authordaid <daid303@gmail.com>
Wed, 19 Feb 2014 09:33:16 +0000 (10:33 +0100)
committerdaid <daid303@gmail.com>
Wed, 19 Feb 2014 09:33:16 +0000 (10:33 +0100)
Cura/gui/util/engineResultView.py
Cura/util/sliceEngine.py

index 11bd5f0c9a08aa0d51fbc503fc8a801cdc0a09c9..53cf51c7ac1dd1fef9b23c10f2aeabad94c2dd9b 100644 (file)
@@ -3,6 +3,7 @@ __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AG
 import wx
 import numpy
 import math
+import threading
 
 import OpenGL
 OpenGL.ERROR_CHECKING = False
@@ -19,6 +20,7 @@ class engineResultView(object):
                self._result = None
                self._enabled = False
                self._gcodeLoadProgress = 0
+               self._resultLock = threading.Lock()
                self._layerVBOs = []
                self._layer20VBOs = []
 
@@ -28,6 +30,7 @@ class engineResultView(object):
                if self._result == result:
                        return
 
+               self._resultLock.acquire()
                self._result = result
 
                #Clean the saved VBO's
@@ -39,6 +42,7 @@ class engineResultView(object):
                                self._parent.glReleaseList.append(layer[typeName])
                self._layerVBOs = []
                self._layer20VBOs = []
+               self._resultLock.release()
 
        def setEnabled(self, enabled):
                self._enabled = enabled
@@ -56,6 +60,7 @@ class engineResultView(object):
                if not self._enabled:
                        return
 
+               self._resultLock.acquire()
                result = self._result
                if result is not None:
                        gcodeLayers = result.getGCodeLayers(self._gcodeLoadCallback)
@@ -152,6 +157,7 @@ class engineResultView(object):
                        glColor4ub(60,60,60,255)
                        openglHelpers.glDrawStringCenter(_("Loading toolpath for visualization (%d%%)") % (self._gcodeLoadProgress * 100))
                        glPopMatrix()
+               self._resultLock.release()
 
        def _polygonsToVBO_lines(self, polygons):
                verts = numpy.zeros((0, 3), numpy.float32)
index 2d06bb21cf9b7ff3cac8cc7cb0cf9b1e9a6f6d78..432038dd2f7da69e3133f85f83fff6b13fd01b64 100644 (file)
@@ -167,6 +167,7 @@ class Engine(object):
        """
        GUI_CMD_REQUEST_MESH = 0x01
        GUI_CMD_SEND_POLYGONS = 0x02
+       GUI_CMD_FINISH_OBJECT = 0x03
 
        def __init__(self, progressCallback):
                self._process = None
@@ -174,7 +175,6 @@ class Engine(object):
                self._callback = progressCallback
                self._progressSteps = ['inset', 'skin', 'export']
                self._objCount = 0
-               self._layerNrOffset = 0
                self._result = None
 
                self._serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -204,6 +204,7 @@ class Engine(object):
                        thread.start()
 
        def _socketConnectionThread(self, sock):
+               layerNrOffset = 0
                while True:
                        try:
                                data = sock.recv(4)
@@ -221,7 +222,7 @@ class Engine(object):
                        elif cmd == self.GUI_CMD_SEND_POLYGONS:
                                cnt = struct.unpack('@i', sock.recv(4))[0]
                                layerNr = struct.unpack('@i', sock.recv(4))[0]
-                               layerNr += self._layerNrOffset
+                               layerNr += layerNrOffset
                                z = struct.unpack('@i', sock.recv(4))[0]
                                z = float(z) / 1000.0
                                typeNameLen = struct.unpack('@i', sock.recv(4))[0]
@@ -245,6 +246,8 @@ class Engine(object):
                                        polygon[:,:-1] = polygon2d
                                        polygon[:,2] = z
                                        polygons[typeName].append(polygon)
+                       elif cmd == self.GUI_CMD_FINISH_OBJECT:
+                               layerNrOffset = len(self._result._polygons)
                        else:
                                print "Unknown command on socket: %x" % (cmd)
 
@@ -393,7 +396,6 @@ class Engine(object):
 
        def _watchStderr(self, stderr):
                objectNr = 0
-               self._layerNrOffset = 0
                line = stderr.readline()
                while len(line) > 0:
                        line = line.strip()
@@ -401,7 +403,6 @@ class Engine(object):
                                line = line.split(':')
                                if line[1] == 'process':
                                        objectNr += 1
-                                       self._layerNrOffset = len(self._result._polygons)
                                elif line[1] in self._progressSteps:
                                        progressValue = float(line[2]) / float(line[3])
                                        progressValue /= len(self._progressSteps)