Source code for gpi.nodeQueue
# Copyright (C) 2014 Dignity Health
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# NO CLINICAL USE. THE SOFTWARE IS NOT INTENDED FOR COMMERCIAL PURPOSES
# AND SHOULD BE USED ONLY FOR NON-COMMERCIAL RESEARCH PURPOSES. THE
# SOFTWARE MAY NOT IN ANY EVENT BE USED FOR ANY CLINICAL OR DIAGNOSTIC
# PURPOSES. YOU ACKNOWLEDGE AND AGREE THAT THE SOFTWARE IS NOT INTENDED FOR
# USE IN ANY HIGH RISK OR STRICT LIABILITY ACTIVITY, INCLUDING BUT NOT
# LIMITED TO LIFE SUPPORT OR EMERGENCY MEDICAL OPERATIONS OR USES. LICENSOR
# MAKES NO WARRANTY AND HAS NO LIABILITY ARISING FROM ANY USE OF THE
# SOFTWARE IN ANY HIGH RISK OR STRICT LIABILITY ACTIVITIES.
# gpi
import gpi
from gpi import QtCore
from .logger import manager
from .node import Node
# start logger for this module
log = manager.getLogger(__name__)
[docs]class GPINodeQueue(QtCore.QObject):
'''The list of nodes to process based on UI and hierarchy changes.
'''
finished = gpi.Signal()
def __init__(self, parent=None):
super(GPINodeQueue, self).__init__(parent)
self._queue = []
self._paused = False
self._last_node_started = '-init-str-'
def __str__(self):
# stringify the status of the queue
msg = "GPINodeQueue object:\n"
msg += "\tis paused: "+str(self.isPaused())+"\n"
msg += "\tis empty: "+str(self.isEmpty())+"\n"
msg += "\tqueue len: "+str(self.getQueueLen())+"\n"
msg += "\tlast node: "+str(self._last_node_started)+"\n"
return msg
def setPause(self, val):
self._paused = val
def isPaused(self):
return self._paused
def isEmpty(self):
if len(self._queue) > 0:
return False
return True
def put(self, node):
if isinstance(node, Node):
self._queue.append(node)
def getQueueLen(self):
return len(self._queue)
def resetQueue(self):
self._queue = []
def setQueue(self, nlist):
self._queue = nlist
def removeNode(self, node):
# removes the first instance of given 'node'
if node in self._queue:
ind = self._queue.index(node)
self._queue.pop(ind)
log.debug("removeNode(): Node(" + node.name + \
"): Removed node from queue.")
return True # SUCCESS
else:
log.debug("removeNode(): Node(" + node.name + \
"): This node was not found in the queue.")
return False # FAILURE
def startNextNode(self):
if self.isPaused():
log.debug("startNextNode(): blocking for pause.")
return 'paused'
# find next node in queue
if len(self._queue) > 0:
while not self._queue[0].isReady():
self._queue.pop(0)
if len(self._queue) == 0:
break
# if queue is done then finalize
if len(self._queue) == 0:
log.debug("startNextNode(): node queue empty, finished.")
self.finished.emit()
return 'finished'
# run next node
node = self._queue.pop(0)
self._last_node_started = node.getName()
if node.hasEventPending():
node.setEventStatus(None)
log.debug("startNextNode(): node: "+node.getName())
node.start()
return 'started'