コード例 #1
0
ファイル: TaskWindow.py プロジェクト: mauch/Obit-1
    def run(self):
        """ Execute and manage task

        """
        ################################################################
        TaskWin           = self
        myTask            = self.myTask
        TaskWin.done      = False

        # Start ObitMess Window for task myTask._name
        try:
            server = ServerProxy(self.url)
            answer = server.CreateWindow(myTask._name)
            self.taskID = answer["taskID"]
        except Exception as e:
            print("Failed to talk to ObitMess",e)
            raise RuntimeError("Cannot talk to ObitMess - start it ")
        
        # Hang around until gui is started
        time.sleep(1.)
        TaskWin.Started   = True
        deadGUI = False  # has GUI died? May want to keep running/logging.
        arg = {"taskID":self.taskID, "status":"Task Running"}
        answer = server.SetStatus(arg)
        deadGUI = deadGUI or (answer['Status']['code']!=0)
        (TaskWin.proxy, TaskWin.tid) = myTask.spawn()
        # Logging to file?
        if len(myTask.logFile)>0:
            TaskLog = open(myTask.logFile,'a')
        else:
            TaskLog = None
        TaskWin.Failed = False
        try:
            while not myTask.finished(TaskWin.proxy, TaskWin.tid):
                messages = myTask.messages(TaskWin.proxy, TaskWin.tid)
                if messages:
                    if not deadGUI:
                        msg = ""
                        # Bundle messages
                        for message in messages:
                            if type(message)==str:
                                msg += message+'\n'
                            else:
                                msg += message[1]+'\n'                       
                        arg = {"taskID":self.taskID, "message":msg}
                        answer  = server.DisplayMessage(arg)
                        # loop if busy
                        while answer['Status']['reason']=="Busy":
                            answer  = server.DisplayMessage(arg)
                        deadGUI = deadGUI or (answer['Status']['code']!=0)
                        # Abort request?
                        doAbort = answer["Abort"]
                        # Input (AIPS) request in message?
                        if (msg.__contains__("** press RETURN for more") or
                            msg.__contains__("just hit RETURN to continue")):
                            answer  = server.UserResponse(self.taskID)
                            # loop if busy
                            while answer['Status']['reason']=="Busy":
                                answer  = server.UserResponse(self.taskID)
                            deadGUI = deadGUI or (answer['Status']['code']!=0)
                            doAbort = doAbort or answer["Abort"]
                            reply   = answer["Result"]
                            if not TaskWin.done:
                                # Feed the task the command
                                myTask.feed(TaskWin.proxy, TaskWin.tid, reply+"\n")
                            else: # Task finished
                                arg = {"taskID":self.taskID, "message":"Task already finished\n"}
                                answer = server.DisplayMessage(arg)
                        # Now abort if requested
                        if doAbort:
                            time.sleep(1.)  # time to shutdown if requested
                            if not myTask.finished(self.proxy, self.tid):
                                # this seems to leave the task in an undead state
                                self.myTask.abort(self.proxy, self.tid)
                            TaskWin.Failed = True
                            TaskWin.done   = True
                        # end if GUI alive
                    if TaskLog:
                        for message in messages:
                            if type(message)==str:
                                x=TaskLog.write('%s\n' % message)
                            else:
                                x=TaskLog.write('%s\n' % message[1])
                        TaskLog.flush()
                continue
        except KeyboardInterrupt as exception:
            print("Something went wrong:",exception)
            myTask.abort(TaskWin.proxy, TaskWin.tid)
            raise exception
        except Exception as e:   # Aborts throw exceptions that get caught here
            TaskWin.Failed = True
            TaskWin.done   = True
            #print "An exception was thrown, task aborted:",e

        if not TaskWin.Failed:
            TaskWin.wait()
            arg = {"taskID":self.taskID, "status":"Task Finished"}
            answer = server.SetStatus(arg)
        else:
            arg = {"taskID":self.taskID, "status":"Task Failed"}
            answer = server.SetStatus(arg)
        TaskWin.done = True

        if TaskLog:
            TaskLog.close()