Domanda

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

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top