[pygtk] Killing or terminating thread in PyGTK

Petr Hracek phracek at redhat.com
Fri Jul 19 18:59:41 WST 2013


Sorry I meant thread of course.
On 07/19/2013 12:46 PM, Petr Hracek wrote:
> 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