0

自動保存スクリプト エディタ スクリプトを開始しました (Maya 2014 を使用) が、非常に不安定で、保存と同時に何かが発生するとクラッシュする可能性があります。また、保存していなくてもクラッシュが発生することに気付いたので、実際の問題が何であるかを見つけようとしたところ、ほとんどコードが残っていませんでしたが、それでも複製できました。

コードの私の考えは、バックグラウンド スレッドを実行し、スクリプトを一定間隔でループしてバックアップしますが、値を毎秒チェックして、一時停止またはキャンセルされていないことを確認します (キャンセルするとループが停止します)。

問題は Maya でのバックグラウンド スレッドの動作に関係していると思われます。スクリプト エディタ ウィンドウをロード/クローズするか、レンダー ビュー設定でタブを切り替えるとクラッシュする可能性があるためです (少なくとも Mental Ray が選択されている場合は、時間がかかるように見えるため)。デフォルトのレンダラーよりも読み込みタブが長くなります)。他の方法もあると思いますが、それらは本当に簡単に見つけられる方法です。

while ループに落とし込んだ後time.sleep()は、なぜクラッシュが発生するのか、私にはまったく意味がありません。また、それが時間モジュールでないことを確認するために、別のスリープ機能を使用しましたwhile time.time()>startTime+1が、それでもクラッシュが発生しました。

誰かがそれを試してみたい場合は、ここに短縮されたコードがあります. でスレッドを開始するとAutoSave.start()、スクリプトエディタウィンドウを継続的にロードして閉じると、最終的にランタイムエラーが発生するはずです (R6025 純粋仮想関数呼び出しを意味します)。複数回の試行が必要になる場合がありますが、最終的には常に発生するようです。

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 に組み込まれたコードを次に示します。変更したバージョンの保存と関係があるのではないかと思いましたが、これは同時に保存しようとしましたが、ループで何も起こらずにまだクラッシュしています。

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];
        }
    }
}
4

2 に答える 2