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()