Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >玛雅线程造成崩溃

玛雅线程造成崩溃
EN

Stack Overflow用户
提问于 2015-03-31 19:38:37
回答 2查看 1.4K关注 0票数 0

我已经启动了一个自动保存脚本编辑器脚本(使用Maya 2014),但是它非常不稳定,如果在保存的同时发生了一些事情,它可能会崩溃。我还意识到即使不保存也会发生崩溃,所以我试图找出实际的问题是什么,最后几乎没有剩下任何代码,但仍然能够复制它。

我对代码的想法是运行一个后台线程,在其中它将循环和备份脚本的间隔,但每秒钟检查一个值,以确保它没有被暂停或取消(取消将停止循环)。

我认为这个问题与后台线程在Maya中的工作方式有关,因为如果加载/关闭脚本编辑器窗口,或者切换呈现视图设置上的选项卡,它可能会崩溃(至少与选中的精神射线有关,因为加载选项卡所用的时间似乎比默认呈现器长)。我想还有其他的方法,但这些方法确实很容易找到。

在while循环中把它转到time.sleep()之后,我真的不明白它为什么会导致崩溃。我还使用了一个不同的睡眠函数来执行while time.time()>startTime+1,以确保它不是时间模块,但它仍然会导致崩溃。

如果有人想尝试使用AutoSave.start()启动线程,如果您继续加载和关闭脚本编辑器窗口,那么最终应该会得到一个运行时错误(即R6025纯虚拟函数调用)。这可能需要多次尝试,但似乎最终都会发生。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import threading, time
import pymel.core as pm

class AutoSaveThread(object):
    def __init__( self ):
        thread = threading.Thread(target=self.run, args=())
        thread.daemon = True
        thread.start()
    def run(self):
        while True:
            time.sleep(1)
            print "Open and close the script editor enough times and this will crash"

class AutoSave:
    @classmethod
    def start( self ):
        AutoSaveThread()

我打开了十几个选项卡,所以加载/关闭所需的时间比没有的时间稍长,这可能会增加崩溃发生的时间窗口。

作为记录,这里是内置在Maya中的代码,每当脚本编辑器窗口关闭时,这些代码都会运行。我认为这可能与我修改过的版本的保存有关,然后尝试同时保存,但它仍然崩溃,循环中什么都没有发生。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
global proc syncExecuterBackupFiles(){
    global string $gCommandExecuter[];
    global string $executerBackupFileName;

    if(`optionVar -q saveActionsScriptEditor`) {
        // clear the script editor temp dir first before writing temp files
        string $scriptEditorTempDir = (`internalVar -userPrefDir` + "scriptEditorTemp/");
        string $tempFiles[] = `getFileList -folder $scriptEditorTempDir`;
        string $file;
        for ($file in $tempFiles) {
            sysFile -delete ($scriptEditorTempDir + $file);
        }

        // save all the executer control text to files
        int $i = 0;
        for($i = 0; $i < size($gCommandExecuter); $i++) {
            cmdScrollFieldExecuter -e -storeContents $executerBackupFileName $gCommandExecuter[$i];
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-31 22:06:44

尝试将对print的调用包装在pymel.mayautils.executeDeferredmaya.utils.executeDeferred中,以便在主UI线程上执行它。

如果您继续加载和关闭脚本编辑器窗口,您最终应该会得到一个运行时错误(即R6025纯虚拟函数调用)。这可能需要多次尝试,但似乎最终都会发生。

我能够证实玛雅2012的这种行为,我怀疑它是否是特定的版本。

我敢打赌,您对print的测试调用实际上是导致Maya崩溃的原因,因为尽管print通常只是一条python语句,但是Maya还是有某种挂钩来用您正在打印的字符串更新脚本编辑器的输出窗口(以及潜在的命令响应栏),这些字符串都运行在主UI线程上。

来自Autodesk知识文章"Python和线程“

Maya和Maya架构并不是线程安全的.如果在主线程之外调用Maya命令,则会抛出异常,并且使用主线程以外的OpenMaya API会产生不可预见的副作用。

通过将您的print语句传递给pymel.mayautils.executeDeferred,我(至少到目前为止,谁知道Maya ;-)无法造成崩溃。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import threading, time
import pymel.core as pm

import pymel.mayautils  # like maya.utils, for executeDeferred

# Set to False at any time to allow your threads to stop
keep_threads_alive = True

def wrapped_print():
    print "Opening and closing the script editor shouldn't make this crash\n"

class AutoSaveThread(object):
    def __init__(self):
        thread = threading.Thread(target=self.run)
        thread.start()
    def run(self):
        while keep_threads_alive:
            time.sleep(1)
            pymel.mayautils.executeDeferred(wrapped_print)

...

特别是包装一个print语句的唯一副作用是它不再回显到命令响应栏。如果保持这种行为对您很重要,那么只需使用pymel.mel.mprint

票数 3
EN

Stack Overflow用户

发布于 2019-02-24 18:19:07

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import threading
import time
import maya.utils as utils
run_timer = True
run_num = 0
def example(interval = 10):
    global run_timer;global run_num;
    def your_function_goes_here():
        print "hello",run_num
        run_num +=1
    while run_timer:
        time.sleep(interval)
        utils.executeDeferred(your_function_goes_here)

t = threading.Thread(None, target = example, args = (1,) )
t.start()

# stop :
# run_timer = False
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29382456

复制
相关文章
JAVA中调用CMD命令,并输出运行结果
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/119104.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/09
1.9K0
nohup命令–linux后台运行程序并实时查看输出
前言 前台运行程序十分的不稳定,当xshell断掉之后,程序也就断掉了。然后同学向我推荐了nohup命令,于是我就非常愉快的使用起来啦~
kirin
2021/03/15
5.2K0
java jps_java11教程–jps命令
抑制类名,JAR文件名和传递给该main方法的参数的输出,从而仅生成本地JVM标识符的列表。
全栈程序员站长
2022/11/05
1.2K0
在 Linux 上使用 jps 命令检查 Java 进程
在 Linux 中,有一些用于查看系统上运行进程的命令。进程是指由内核管理的正在进行的事件。每启动一个应用程序时,就会产生一个进程,但也有许多在计算机后台运行的进程,如保持系统时间准确的进程、监听新文件系统的进程、索引化文件的进程等。有一些可以用来监测这些进程的实用程序,比如包含在 procps-ng 包 中的程序,但它们往往都是对各种进程通用的。它们会查看计算机上的所有进程,你可以根据需要过滤结果列表。
用户9105998
2021/11/22
2.7K0
在 Linux 上使用 jps 命令检查 Java 进程
在 Linux 中,有一些用于查看系统上运行进程的命令。进程是指由内核管理的正在进行的事件。每启动一个应用程序时,就会产生一个进程,但也有许多在计算机后台运行的进程,如保持系统时间准确的进程、监听新文件系统的进程、索引化文件的进程等。有一些可以用来监测这些进程的实用程序,比如包含在 procps-ng 包 中的程序,但它们往往都是对各种进程通用的。它们会查看计算机上的所有进程,你可以根据需要过滤结果列表。在 Linux 中,可以通过 ps 命令查看进程。这是查看当前系统上运行进程最简单的方法。
用户8989785
2021/10/13
2.8K0
java jps命令使用解析
在linux环境下显示一个进程的信息大家可能一直都在使用ps命令,比如用以下命令来显示当前系统执行的java进程:
程序新视界
2022/05/06
1.5K0
Windows中jps命令无法查看java进程问题
{user}为当前登录用户名) 目录下建立一个以该 java 进程 pid 为文件名的文件,用以记录该 java 进程的一些信息。 通常是因为没有对这个文件的写入权限而导致jps命令查看不到进程
夹胡碰
2020/10/27
4.5K0
Windows中jps命令无法查看java进程问题
spark (java API) 在Intellij IDEA中开发并运行
王小雷
2018/01/02
3.8K0
spark (java API) 在Intellij IDEA中开发并运行
java程序编译命令_使用 java 命令编译运行 java 程序
java 编译的过程,就是将 java 项目从源文件变成 .class 文件的过程,而 .class 文件,最后会被加载到JVM 中运行。在 JDK bin/ 目录下,提供了 javac 命令,用于将 .java 源文件编译成 .class 字节码文件,提供了 java 命令,以 Main_Class 为入口,根据运行需要,加载相应的 class 文件到 JVM 中执行。
全栈程序员站长
2022/09/08
3.1K0
Java的jps命令使用详解
jps(Java Virtual Machine Process Status Tool)是JDK提供的一个可以列出正在运行的Java虚拟机的进程信息的命令行工具,它可以显示Java虚拟机进程的执行主类(Main Class,main()函数所在的类)名称、本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)等信息。另外,jps命令只能显示它有访问权限的Java进程的信息。
万猫学社
2022/04/22
6.5K0
Java命令学习系列(一)——Jps
jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。 jps相当于Solaris进程工具ps。不象”pgrep java”或”ps -ef grep java”,jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包括即使没有使用java执行体的那种(例如,定制的启动 器)。另外,jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。
九州暮云
2019/08/21
3.7K0
jps 命令_jps只有一个jps进程
jps(全称:Java Virtual Machine Process Status Tool)是 java 提供的一个用来显示当前所有 java 进程的 pid 的命令。
全栈程序员站长
2022/11/05
3.3K0
jps 命令_jps只有一个jps进程
JPS 命令演示 & 我们只用 jps -lv
jps命令是我们安装JDK内置的指令。jps命令主要查看java进程信息。(只要我们系统配置了JDK的环境变量。我们就可以使用jps命令)
收心
2022/10/31
1.7K0
linux c程序中获取shell脚本输出
  Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作。比如实现一个ping程序来测试网络的连通性,实现ping函数需要写上200~300行代码,为什么不能直接调用系统的ping命令呢?通常在程序中通过 system函数来调用shell命令。但是,system函数仅返回命令是否执行成功,而我们可能需要获得shell命令在控制台上输出的结果。例如,执行外部命令ping后,如果执行失败,我们希望得到ping的返回信息。
阳光岛主
2019/02/19
5.6K0
linux jps 命令
jps -- Java Virtual Machine Process Status Tool
微风-- 轻许--
2020/04/30
3.6K0
java环境配置及jps命令未找到
最近基于CentOS 7下安装hadoop集群,碰到了java环境变量的问题,同时也出现了jps命令无法找到的情况。简要描述一下基于CentOS 7下Java环境的配置及jps命令未找到的处理。
Leshami
2018/08/06
3.3K0
python 从subprocess运行的子进程中实时获取输出
shell =false 意思是command 使用的不是linux shell指令,如果要用shell 指令如ls 要将false 变成true, 通过指定stderr=subprocess.STDOUT,将子程序的标准错误输出重定向到了标准输出,以使我们可以直接从标准输出中同时获取标准输出和标准错误的信息。 p.poll() 返回子进程的返回值,如果为None 表示 c++子进程还未结束. p.stdout.readline() 从 c++的标准输出里获取一行.
多凡
2020/02/11
10.5K0
windows下C与C++执行cmd命令并实时获取输出
在windows下一般会使用系统的cmd命令或者其他现成的一些命令行可执行程序来完成一些操作,比如:调用ping命令来测试网络是否畅通、调用ffmpeg命令进行视频转码等等。为了能在软件界面上有更好的交互输出,都需要将命令执行的过程拿到,进行处理,然后在界面上进行显示,让用户知道程序正在正常运行,下面就介绍几种输出的获取方式。
DS小龙哥
2022/05/28
6.6K0
windows下C与C++执行cmd命令并实时获取输出
jps命令详解_jps用什么文件打开
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。它和linux中的ps有类似的功能。
全栈程序员站长
2022/10/05
1.8K0
点击加载更多

相似问题

包含小计/总计的嵌套网格视图

10

SSRS总计应与小计和而不是源值

20

SSRS 2008小计和总计合计不正确

10

小计和总计

117

查找小计和总计

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文