时间睡眠,允许父应用程序继续评估?

2024-05-13 12:20:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近在为Maya和Houdini编写脚本时遇到过这样的情况:在调用Python代码的其余部分之前,我需要等待GUI的某些方面更新。我在想打电话时间。睡觉在这两种情况下都可以解决我的问题,但看起来时间。睡觉只需保留父应用程序。这意味着我的脚本计算结果完全相同,不管睡眠是否在那里,它只是中途暂停。在

我想用Python在一个单独的线程中运行我的脚本,看看这是否能释放应用程序在睡眠期间仍能运行,但我还没有时间来测试这一点。在

我想我会问一下,如果有人知道这个场景的其他解决方案。在


Tags: 代码脚本应用程序时间场景情况gui解决方案
2条回答

一个比睡眠更好的解决方案是while循环。设置while循环来检查共享值(甚至像队列这样的线程安全结构)。您等待的父进程可以执行其工作(或子进程,谁生成什么并不重要),当它们完成工作时,它们向队列/变量发送true/false/0/1/whatever,让其他进程知道它们可以继续。在

Maya—或者更确切地说是Maya Python—并不是真正的多线程(Python本身有一种不可靠的多线程,因为所有线程都在为恐惧而斗争,但这不是您这里的问题)。可以使用线程模块在Maya中运行线程化代码;请尝试:

import time
import threading
def test():
   for n in range (0, 10):
       print "hello"
       time.sleep(1)
 t = threading.Thread(target = test)
 t.start()

这将在不关闭交互的情况下,每隔一秒向听众打印“hello”10次。在

不幸的是,maya的许多部分-包括最显著的所有用户创建的UI和大多数种类的场景操作-只能从“主”线程运行-该线程拥有maya UI。因此,您无法使用上述技术编写脚本来更改窗口中文本框的内容(更糟的是,您将得到误导性的错误消息—当您从侦听器运行它时,该代码是有效的,但当您从线程调用它并礼貌地返回完全错误的错误代码时,会出现错误)。你可以在一个单独的线程中执行诸如网络通信、写入文件或长时间计算之类的事情—没问题,但是如果你试图从线程中执行UI工作和许多常见场景任务,则会失败。在

Maya在maya.utils模块中对此有部分解决方法。可以使用函数executeFerred和executeInMainThreadWithResult。它们将等待一段空闲时间来运行(这意味着,例如,如果您正在播放动画,它们将不会运行),然后像在主线程中那样启动它们。maya文档中的示例给出了以下想法:

^{pr2}$

这可以让你得到你想要的大部分,但是你需要仔细考虑如何将你的任务分解成线程友好的块。当然,运行线程程序总是比单线程的替代方案更难,你需要设计代码,这样当你工作时,另一个线程搞乱了一个变量,事情就不会中断。好的并行编程是一大壶鱼,尽管归结为以下几个基本思想:

1)在需要时使用RLocks建立对对象的独占控制(对于短期操作) 2) 将共享数据放入安全容器中,如@dylan示例中的Queue 3) 明确哪些对象是可共享的(它们应该很少!)哪一个不是

这是decent (long) overview.

至于胡迪尼,我不确定,但this article听起来像是那里也出现了类似的问题。在

相关问题 更多 >