【发布时间】:2014-12-19 18:11:55
【问题描述】:
我在 Linux 上用 python 和 pygame 编写了一个程序。我的问题是,当我调用在调制解调器上拨出然后发送消息的函数时,程序会暂停,直到函数完成。我需要一种subprocess 或线程函数的方法。我是 python 和 pygame 的新手,所以这可能很简单,但我尝试过的一切都失败了。
另外,我确信可能有一种更优雅的方式来处理声音和暂停。第一个sleep 给调制解调器调用时间。接下来的两个用于单词和句子之间的自然发音暂停,最后一个是在调制解调器挂断之前给整个脚本时间来传递消息。
我正在调用函数并像这样传递变量:
A = 'Electronic_Chime.mp3'
B = 'please_check.mp3'
C = 'three.mp3'
contact_user(A,B,C)
这是函数:
def contact_user( A, B, C ):
ser.write("ATDT441\r") # Attention - Dial via tone number
time.sleep(6)
pygame.mixer.music.load(A)
pygame.mixer.music.play()
time.sleep(2)
pygame.mixer.music.load(B)
pygame.mixer.music.play(1)
time.sleep(2)
pygame.mixer.music.load(C)
pygame.mixer.music.queue(C)
pygame.mixer.music.play()
time.sleep(10)
任何想法或建议将不胜感激。
PS。我试过了:
thread1 = threading.Thread(contact_user(A,B,C))
thread1.start()
即使我已经线程化了contact_user(A,B,C),该程序的行为似乎完全相同。
【问题讨论】:
-
我不熟悉您要执行的操作,但我可以告诉您,您的最后一段代码尝试使用等于 RETURN 的目标函数调用
threading.Threadcontact_user(A, B, C)的值。而是使用thread1 = threading.Thread(lambda: contact_user(A,B,C))或使用functools.partial来构建函数(例如thread1 = threading.Thread(partial(contact_user, A, B, C))) -
你是说我的主程序可能正在等待返回值,然后再继续?另外,为什么是 lambda: 和 partial?
-
@AdamSmith:您应该将其发布为答案。虽然线程调用仍然不正确。请参阅下面的评论。
-
@user72055:
f()在 Python 中调用函数f。要将函数调用推迟到另一个线程,请改用Thread(target=contact_user, args=[A,B,C])。此外,您应该避免在与其他pygame调用相同的函数中使用time.sleep(),而是安排一个操作(事件驱动的方法)。 -
例如,您可以在 2 秒内调用 stop
A(在 timer event 上),而不是在load(A); play()之后休眠2秒,这里是 code example
标签: python multithreading pygame subprocess