Handge
Handge

Reputation: 75

RuntimeError: threads can only be started once

I was making a simple Python game. I was trying to fix the following error:

RuntimeError: threads can only be started once

I have tried .cancel() the timer but that hasn't seem to be working, and I have made a if statement to see if the timer .is_alive before executing it. The console is throwing the error off at ball_char = play_timer.start().

def playball(state):
 batbox = [["@", "@", "@", "@"], ["@", "#", "#", "#", "@"], ["@", "#", "#", "#", "@"], ["@", "#", "#", "#", "@"], ["@", "@", "@", "@"]]
 play = "playing"
 play_timer = Timer(1.0, pitch(batbox))
 end_timer = Timer(6.0, pitch_end(play))
 play_timer.cancel()
 end_timer.cancel()
 pstate = "idle"
 inning = 1
 outs = 0
 pscore =0
 cscore = 0
 strikes = 0
 ball_row = 0
 ball_col = 0
 ball_char = "."
 while play == "playing":
     batbox = [["@", "@", "@", "@"], ["@", "#", "#", "#", "@"], ["@", "#", "#", "#", "@"], ["@", "#", "#", "#", "@"], ["@", "@", "@", "@"]]
     os.system('cls')  # on windows
     os.system('clear') # on linux / os x
     # Playing the game
     print "Press enter to start / hit the pitch"
     print_grid(batbox)
     input = raw_input("")
     pstate = "hitting"
     # Hitting
     if pstate == "hitting":
         ball_row = random_row(batbox) 
         ball_col = random_col(batbox)
         end_timer.start()
         while pstate == "hitting":
             batbox[ball_row][ball_col] = ball_char
             if play_timer.is_alive():
                 play_timer.cancel()
             else:
                 ball_char = play_timer.start()
 else:
     play_timer.cancel()
     end_timer.cancel()
     state = "mainmenue"
     return state

Upvotes: 5

Views: 14382

Answers (1)

mbrig
mbrig

Reputation: 963

The documentation for Threading.Thread (of which Timer is a subclass) states:

start() Start the thread’s activity.

It must be called at most once per thread object. It arranges for the object’s run() method to be invoked in a separate thread of control.

This method will raise a RuntimeError if called more than once on the same thread object.

Even if you cancel a thread (or timer), you still cannot call start() again. You need to create a new thread/timer object or it is an error.

Upvotes: 11

Related Questions