[pygtk] Killing or terminating daemon in PyGTK

Petr Hracek phracek at redhat.com
Fri Jul 19 18:46:12 WST 2013


Hi folks,

my threads is running well.
But I would like to implement terminating of thread. I have two approaches
but any of these is not working properly till now.

First approach:
1) class contain function: run_function()
2) over button I call:
         self.thread = threading.Thread(target=self.run_function()
         self.stop = threading.Event()
3) over stop button I would like to cancel thread. In that function is 
written:
         if self.thread.isAlive():
             self.stop.set()
             self.thread.join()
This approach unfortunatelly does not work.

Second approach:
class DevAssistantThread(threading.Thread):
     def __init__(self, target = None):
         threading.Thread.__init__(self)
         self._terminate = False
         self.target = target
         self.stop = threading.Event()

     def terminate(self):
         print "terminate is called"
         self._terminate = True
         self.stop.set()
         print "terminate is finished"

     def run(self):
         print "Function was run"
         self.target()
         print "Function was finished"
         while True:
             if self._terminate:
                 print "Thread is canceled"
                 break

class runWindow(object):
     def __init__(self,  parent, finalWindow, builder, assistant):
         self.thread = DevAssistantThread(target=self.devassistant_start)

     # Thread is started during the opening window
     def open_window(self, widget, data=None):
         dirname, projectname = self.parent.pathWindow.get_data()
         self.runWindow.show_all()
         self.cancelBtn.set_sensitive(False)
         self.thread.start()
         self.cancelBtn.set_sensitive(True)

     # Function for cancelling thread
     def close_btn(self, widget, data=None):
         name = self.cancelBtn.get_label()
         if name == "Cancel":
             print self.thread.isAlive()
             if self.thread.isAlive():
                 Gdk.threads_enter()
                 self.stop.set()
                 self.thread.join()
                 Gdk.threads_leave()
             Gtk.main_quit()
         else:
             print "Quit dialog"
             Gtk.main_quit()
     def devassistant_start(self):
         logger_gui.info("Thread run")
         path = 
self.assistant.get_selected_subassistant_path(**self.parent.kwargs)
         pr = path_runner.PathRunner(path, self.parent.kwargs)
         try:
             pr.run()
             Gdk.threads_enter()
             self.cancelBtn.set_label("Close")
             Gdk.threads_leave()
         except exceptions.ExecutionException as ex:
             pass

Unfortunatelly also second approach is not working well. Respectivelli 
it does not work at all.

Do you have any idea where I have made mistake?

Thank you in advance

-- 
Best regards / S pozdravem
Petr Hracek



More information about the pygtk mailing list