【问题标题】:threading in pygamepygame中的线程
【发布时间】: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.Thread 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_user, args=[A,B,C])。此外,您应该避免在与其他 pygame 调用相同的函数中使用 time.sleep(),而是安排一个操作(事件驱动的方法)。
  • 例如,您可以在 2 秒内调用 stop A(在 timer event 上),而不是在 load(A); play() 之后休眠 2 秒,这里是 code example

标签: python multithreading pygame subprocess


【解决方案1】:

我的主要问题是我没有正确地将我的论点传递给我的线程。以下是适合我的代码。

我的功能:

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()

感谢所有帮助我的人。非常感谢。

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 2011-02-27
    • 1970-01-01
    • 2022-11-06
    • 2022-06-14
    • 2021-06-04
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    相关资源
    最近更新 更多