Refinements and tests for cancelling processes
svn: r13719
This commit is contained in:
		| @@ -26,11 +26,11 @@ class LongOpStatus(Callback): | ||||
| 	} | ||||
|      | ||||
|         def long(self): | ||||
|         status = LongOpStatus("doing long job", 100, 10) | ||||
|             status = LongOpStatus("doing long job", 100, 10) | ||||
|  | ||||
|             for i in xrange(0,99): | ||||
|             time.sleep(0.1) | ||||
|             status.heartbeat() | ||||
|                 time.sleep(0.1) | ||||
|                 status.heartbeat() | ||||
|  | ||||
|             status.end() | ||||
|      | ||||
| @@ -124,6 +124,12 @@ class LongOpStatus(Callback): | ||||
|         """ | ||||
|         return self._secs_left | ||||
|  | ||||
|     def was_cancelled(self): | ||||
|         """ | ||||
|         Has this process been cancelled? | ||||
|         """ | ||||
|         return self._cancel | ||||
|  | ||||
|     def cancel(self): | ||||
|         """Inform the operation that it should complete. | ||||
|         """ | ||||
| @@ -186,7 +192,7 @@ class LongOpStatus(Callback): | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|  | ||||
|     s = LongOpStatus("msg", 100, 10) | ||||
|     s = LongOpStatus("msg", 100, 10, can_cancel=True) | ||||
|  | ||||
|     def heartbeat(): | ||||
|         print "heartbeat ", s.estimated_secs_to_complete() | ||||
| @@ -197,9 +203,20 @@ if __name__ == '__main__': | ||||
|     s.connect('op-heartbeat', heartbeat) | ||||
|     s.connect('op-end', end) | ||||
|  | ||||
|     import signal | ||||
|  | ||||
|     def ctrlc_handler(signum, frame): | ||||
|         print "Received interrupt!" | ||||
|         s.cancel() | ||||
|  | ||||
|     signal.signal(signal.SIGINT, ctrlc_handler) | ||||
|  | ||||
|     for i in xrange(0, 99): | ||||
|         if s.should_cancel(): | ||||
|             break | ||||
|         time.sleep(0.1) | ||||
|         s.heartbeat() | ||||
|  | ||||
|     s.end() | ||||
|     if not s.was_cancelled(): | ||||
|         s.end() | ||||
|      | ||||
|   | ||||
| @@ -126,6 +126,10 @@ class ProgressMonitor(object): | ||||
|          | ||||
|         log.debug("heartbeat in ProgressMonitor") | ||||
|          | ||||
|         if idx >= len(self._status_stack): | ||||
|             # this item has been cancelled | ||||
|             return | ||||
|  | ||||
|         facade = self._status_stack[idx] | ||||
|          | ||||
|         if facade.status_obj.estimated_secs_to_complete() > self._popup_time: | ||||
| @@ -143,8 +147,15 @@ class ProgressMonitor(object): | ||||
|     def _end(self, idx): | ||||
|         # hide any progress dialog | ||||
|         # remove the status object from the stack | ||||
|          | ||||
|         log.debug("received end in ProgressMonitor") | ||||
|  | ||||
|         if idx >= len(self._status_stack): | ||||
|             # this item has been cancelled | ||||
|             return | ||||
|  | ||||
|         while idx < len(self._status_stack) - 1: | ||||
|             self._end(len(self._status_stack) - 1) | ||||
|  | ||||
|         facade = self._status_stack[idx] | ||||
|         if facade.active: | ||||
|             dlg = self._get_dlg() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user