0

У меня есть небольшая проблема с многопоточным скриптом python в игровом движке blender. Работает хорошо, но когда я останавливаю игру, она вызывает некоторые исключения и иногда падает.Python multithreading - закрывающая нить в Blender

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 

Консоль пишет:

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__ 

Я был бы рад, если кто-то может найти то, что случилось с ним. Спасибо

+0

Можете ли вы включить исключения, которые вы задаете в своем вопросе? Кроме того, 'self.Thread = Thread' просто выглядит странно. Для чего эта линия? – phihag

+0

Sure, Необработанное исключение в потоке, начатое с помощью > Traceback (последний последний звонок): Файл «C: \ Program Files (x86) \ Blender Foundation \ Blender \ 2.64 \ python \ lib \ thread ing.py ", строка 709, в _bootstrap self._bootstrap_inner() Файл" C: \ Program Files (x86) \ Blender Foundation \ Blender \ 2.64 \ python \ lib \ thread ing.py ", строка 784, в _bootstrap_inner с _active_limbo_lock: AttributeError: __exit__ – Z4urce

+0

Лучше добавьте его в вопрос, чтобы он был отформатирован. – phihag

ответ

1

Это well-known limitation of Python scripting in Blender.

Проблема в том, что Blender срывает Python перед вашей нитью. То, что вы можете попытаться сделать, - это каким-то образом зарегистрировать, что Blender (или ваша игра) выходит, уведомляет вашу нить, и join это из основного потока.