From: daid Date: Wed, 19 Feb 2014 09:33:16 +0000 (+0100) Subject: Fix race conditions. X-Git-Tag: 14.02-RC3~5 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=e844398853f7741fbe0e65c5ad1c7d7b8c3e2bde;p=cura.git Fix race conditions. --- diff --git a/Cura/gui/util/engineResultView.py b/Cura/gui/util/engineResultView.py index 11bd5f0c..53cf51c7 100644 --- a/Cura/gui/util/engineResultView.py +++ b/Cura/gui/util/engineResultView.py @@ -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) diff --git a/Cura/util/sliceEngine.py b/Cura/util/sliceEngine.py index 2d06bb21..432038dd 100644 --- a/Cura/util/sliceEngine.py +++ b/Cura/util/sliceEngine.py @@ -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)