Python, функция потока не выполняется, и объект исчезает

Мы пытаемся запустить этот код на Python, но пока работает функция print_time, TestReactionTime не выполняется (даже не печатает). Вызовы обеих функций идентичны.

Также и независимо, когда мы впервые отпускаем мяч и пытаемся снова его схватить, он исчезает.

Любая помощь с любой из проблем будет благодарна.

(Программа, которую мы используем, это Vizard)

import viz
import math
import viztask
import vizinfo
import thread
import time

count = 0
boolTime = False

viz.setMultiSample(4)
viz.fov(20)
viz.go()

viz.phys.enable()
viz.phys.setGravity( [0, 0, 0] )
viz.window.setFullscreen()

viz.setOption('viz.model.apply_collada_scale',1)
ball = viz.add('ball.dae')
ball.setPosition([-0.1,1.5,4])
#ball.setScale([0.75,0.75,0.75])
ball.collideSphere()


viz.setOption('viz.model.apply_collada_scale',1)
path = viz.addChild('path.dae')
path.setPosition([-1,1.0,4])
path.collideMesh()

#collision
path.enable(viz.COLLIDE_NOTIFY)
def onCollide(e):
        global count 
        count = count+1
        print(count)

viz.callback( viz.COLLIDE_BEGIN_EVENT, onCollide )

#mouse
viz.mouse.setOverride(viz.ON) 
link = None 

**def TestReactionTime(threadName):**
    print 'boolTime: '
    print(boolTime)
    while boolTime:
        #Wait for next frame to be drawn to screen
        d = yield viztask.waitDraw()

        #Save display time
        displayTime = d.time

        #Wait for keyboard reaction
        d = yield viztask.waitMouseUp(viz.MOUSEBUTTON_LEFT)

        #Calculate reaction time
        reactionTime = d.time - displayTime
        print(reactionTime)

def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )

def grabBall():
    global link
    global boolTime
    boolTime = True
    print("grab ")
    print(boolTime)
    try:
        #thread.start_new_thread( TestReactionTime,() )
        thread.start_new_thread( TestReactionTime, ("Thread-3", ) )
        thread.start_new_thread( print_time, ("Thread-1", 2, ) )
        print("execute thread")
    except:
        print "Error: unable to start thread"
    link = viz.grab( viz.Mouse, ball )


def releaseBall():
    global link,boolTime
    boolTime = False
    link.remove()
    link = None

vizact.onmousedown(viz.MOUSEBUTTON_LEFT,grabBall)
vizact.onmouseup(viz.MOUSEBUTTON_LEFT,releaseBall)

1 ответ

После того, как вы создаете темы, вы должны join их так, что основная программа ожидает завершения выполнения каждого потока.

thread Модуль не предоставляет никаких условий для ожидания потока. Вы должны использовать рекомендованный Threading модуль

изменить thread.start_new_thread звонки с Thread()

    from threading import Thread

    #do something

    try:
       thread1 = Thread( target = TestReactionTime, args = ("Thread-3", ) )
       thread2 = Thread( target = print_time, args = ("Thread-1", 2, ) )

       thread1.start()
       thread2.start()

       thread1.join()
       thread2.join()

   #do the rest
Другие вопросы по тегам