Python pygame中的线程
我在Linux上用python和pygame编写了一个程序。我的问题是,当我调用在调制解调器上拨出的功能,然后发送消息时,程序会暂停,直到功能完成。我需要一种方法来Python pygame中的线程,python,multithreading,pygame,subprocess,Python,Multithreading,Pygame,Subprocess,我在Linux上用python和pygame编写了一个程序。我的问题是,当我调用在调制解调器上拨出的功能,然后发送消息时,程序会暂停,直到功能完成。我需要一种方法来子进程或线程化函数。我是python和pygame新手,所以这可能很简单,但我尝试过的一切都失败了 另外,我相信可能有一种更优雅的方式来处理声音和停顿。第一个睡眠为调制解调器提供通话时间。接下来的两个是单词和句子之间的自然停顿,最后一个是在调制解调器挂断之前给整个脚本时间来传递消息 我调用函数并传递如下变量: A = 'Electro
子进程
或线程化函数。我是python和pygame新手,所以这可能很简单,但我尝试过的一切都失败了
另外,我相信可能有一种更优雅的方式来处理声音和停顿。第一个睡眠
为调制解调器提供通话时间。接下来的两个是单词和句子之间的自然停顿,最后一个是在调制解调器挂断之前给整个脚本时间来传递消息
我调用函数并传递如下变量:
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)
def contact_user(A,B,C):
ser.write("ATDT411\r") # Attention - Dial Tone 411
time.sleep(5) # Wait for modem to finish dialing
pygame.mixer.music.load(A)
pygame.mixer.music.play() # Play attention chime
time.sleep(2) # Wait long enough for first message chime to play before moving on
pygame.mixer.music.load(B)
pygame.mixer.music.play(1) # Play next message
time.sleep(2) # Wait long enough for second message to play before moving on
pygame.mixer.music.load(C) # Load last message
pygame.mixer.music.queue(C) # Queue second instance of last message
pygame.mixer.music.play() # Play last message twice
time.sleep(10) # Wait long enough for last message to play
ser.write("ATH\r") # Attention - Hang up line
ser.write("ATZ\r") # Attention - Reset modem
ser.close()
如有任何意见或建议,将不胜感激
注:我试过:
thread1 = threading.Thread(contact_user(A,B,C))
thread1.start()
程序的行为似乎完全相同,尽管我已经线程化了
联系用户(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)
def contact_user(A,B,C):
ser.write("ATDT411\r") # Attention - Dial Tone 411
time.sleep(5) # Wait for modem to finish dialing
pygame.mixer.music.load(A)
pygame.mixer.music.play() # Play attention chime
time.sleep(2) # Wait long enough for first message chime to play before moving on
pygame.mixer.music.load(B)
pygame.mixer.music.play(1) # Play next message
time.sleep(2) # Wait long enough for second message to play before moving on
pygame.mixer.music.load(C) # Load last message
pygame.mixer.music.queue(C) # Queue second instance of last message
pygame.mixer.music.play() # Play last message twice
time.sleep(10) # Wait long enough for last message to play
ser.write("ATH\r") # Attention - Hang up line
ser.write("ATZ\r") # Attention - Reset modem
ser.close()
从主程序调用函数:
t = threading.Thread(name = 'dial', target = contact_user, args = (A,B,C))
t.start()
感谢所有在这方面帮助过我的人。非常感谢。我不熟悉您正在尝试做什么,但我可以告诉您,您的最后一位代码尝试调用
线程。线程
,目标函数等于的返回值contact_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\u user,args=[A,B,C])
。此外,您应该避免在与其他pygame
调用相同的函数中使用time.sleep()
,而是安排一个操作(事件驱动方法)。例如,在load(A)之后的2
秒时不要睡觉;play()
您可以在2秒钟内调用stopA
,以下是