spinner class thread error - only one thread allowed

I already asked a question about this yesterday, but now I have another :) im trying to write a text effects type class for my terminal apps to use - it does stuff like position cursor, clear screen, colour selection inside the echo string with colours preceded by an '@', random case, colour cylcling and other fun stuff (partly to aid my learning of python and partly for usefulness) - if I wanted to have parts of my class not be a thread how would I do it ? at the moment I have this spinner thing working (whole code here) but I want to call it multiple times. like this:

s=spin()
s.echo('@@') # clears screen
# at the moment - here i get an error because only one thread can be started
s.echo('@red this is red @green green etc...')

the echo function does a lot of stuff as you can see if you look at the pastebin, so i need to call that quite a bit, but multiple calls result in 'only one thread' allowed error. perhaps i should be doing it a different way. This was the basic old code before the pastebin stuff.

spinner="▏▎▍▌▋▊▉█▉▊▌▍▎" #utf8

#convert the utf8 spinner string to a list
chars=[c.encode("utf-8") for c in unicode(spinner,"utf-8")]

class spin(threading.Thread):

    def __init__(self):
        super(spin,self).__init__()
        self._stop = False

    def run (self):
        pos=0
        while not self._stop:
            sys.stdout.write("\r"+chars[pos])
            sys.stdout.flush()
            time.sleep(.15)
            pos+=1
            pos%=len(chars)

    def cursor_visible(self):
        os.system("tput cvvis")
    def cursor_invisible(self):
        os.system("tput civis")
    def stop(self):
        self._stop = True
    def stopped(self):
        return self._stop == True

Answers


Only the run method is actually running in a diffrent thread. The problem with your code is that you try to start the thread more than one time (in the echo method). You should check if the thread is already started (look at self._stop) before starting.

def echo (self, arg=None, sep=' ', end='\n', rndcase=True, txtspeed=0.03, bnum=0, spsw=True):
    print cursave, 
    self.cursor_invisible()

    # do you have to do all this ? 
    # c0m4: Only if you need all of those to be accessible for the spin object when echo ends
    self.arg=arg
    self.sep=sep
    self.end=end
    self.rndcase=rndcase
    self.txtspeed=txtspeed
    self.bnum=bnum
    self.spsw=spsw

    pos=0
    cmd, txt = [reset], []
    spsw=True
    last_colour=''
    txtpos=0
    if arg:

# test if spinner is wanted and set the text position to be moved across a bit to allow for it
    if spsw is True:
    txtpos=4
    self.start()

The last line if where the troubles start. It is not possible to start a thread more then once. Therefore you need to check if the thread is running before you restart it. Add something like

self.running = False

to your init method, and then set it in the run method

self.running = True

Then you can check the status of the object (thread running or not) like this:

if not self.running:
    self.start()

If you need to run the initial portion of run regardless, you should put that in a separate method, like this:

def resetThread():
    self.pos = 0

Need Your Help

How to monitor which files are writting code to others?

javascript wordpress exploit

It appears there is a new exploit/hack going around where a Wordpress plugin is writing a .js file before every closing </head> tags in every Wordpress installation's .php files on my server...

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.