Using threads to quit the main python process

James Mills prologic at shortcircuit.net.au
Tue Oct 28 21:11:02 EDT 2008


On Wed, Oct 29, 2008 at 10:42 AM, sharpblade <sharpblade1 at gmail.com> wrote:
> Is there a way I can use threads to quit the main python process?
> In brief, I have a python script that starts when my computer starts. It
> chooses a random wallpaper background out of a specified path, and sets it
> as the desktop wallpaper. It also hooks some windows hot keys so I can cycle
> through all the wallpapers, or choose another one, or quit it, by using F8,
> F7 and F6 respectively.
> However, I would quite like the script to self-terminate if no user input is
> received after X seconds. At first this seemed simple - Create a separate
> thread that used time.sleep() to sleep for X seconds, then run a callback.
> The callback would check a simple Boolean (Set to True if a hot key is
> pressed, set to False at start of the script), and if the Boolean was False,
> it would simply run exit(), and this would close the window.
>
> However, it is not that simple. The callback and the thread work fine, but
> the exit() seems to close the THREAD, not the main process. I have tried
> sys.exit(), and some other forms I found on the Internet (Raising exceptions
> and setting the thread to a daemon), but none seemed to close the actual
> interpreter. I tried using the .join() function, but this called an
> exception that told me the thread could not be joined.
>
> Here is my threaded_test.py code: http://pastebin.com/f6060d15a

I prefer not to use threads if I can help it. Here's
a simple little example that doesn't use threads
at all and uses an event-driven approach instead
using my circuits library [1].
<code>
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: set sw=3 sts=3 ts=3

from circuits import listener, Event, Component, Timer, Manager
from circuits.lib.io import Stdin

class Test(Component):

  @listener("stop")
  def onSTOP(self):
     raise SystemExit, 0

  @listener("stdin:read")
  def onINPUT(self, data):
     print data

def main():
  manager = Manager()
  stdin = Stdin()
  test = Test()
  timer = Timer(5, Event(), "stop")

  manager += stdin
  manager += test
  manager += timer

  while True:
     try:
        manager.flush()
        stdin.poll()
        timer.poll()
     except SystemExit:
        break
     except KeyboardInterrupt:
        break

if __name__ == "__main__":
  main()
</code>

cheers
James

[1] http://hg.softcircuit.com.au/projects/circuits/
http://trac.softcircuit.com.au/circuits/

--
--
-- "Problems are solved by method"



More information about the Python-list mailing list