Reputation: 516
I have a little problem, with a multithreaded python script in blender game engine. It works alright, but when I stop the game, It raises some exceptions and sometimes crashes.
from bge import logic
import time
from threading import Thread
def init():
if not hasattr(logic, 'init'):
logic.init = 0
logic.thread = new()
logic.thread.start()
logic.thread.restart()
class new(Thread):
def __init__(self):
self.Thread = Thread
self.Thread.__init__(self)
def run(self):
number = 0
while 1:
number += 1
print(number)
try:
main()
time.sleep(0.1)
except:
break
def restart(self):
self.Thread.__init__(self)
def main(): #this part isn't important now ...
cam = bge.logic.getCurrentScene().active_camera
obj = bge.logic.getCurrentController().owner
obj.worldPosition.x = cam.worldPosition.x
obj.worldPosition.y = cam.worldPosition.y
The console writes:
Unhandled exception in thread started by <bound method new._bootstrap of <new(Th
read-80, initial)>>
Traceback (most recent call last):
File "C:\Program Files (x86)\Blender Foundation\Blender\2.64\python\lib\thread
ing.py", line 709, in _bootstrap
self._bootstrap_inner()
File "C:\Program Files (x86)\Blender Foundation\Blender\2.64\python\lib\thread
ing.py", line 784, in _bootstrap_inner
with _active_limbo_lock:
AttributeError: __exit__
I would be glad, if someone could find what's wrong with it. Thank you
Upvotes: 0
Views: 3723
Reputation: 287835
That's a well-known limitation of Python scripting in Blender.
The problem is that Blender tears down Python before your thread. What you can try to do is to somehow register that Blender (or your game) is exiting, notify your thread, and join
it from the main thread.
Upvotes: 2