Я запустил скрипт редактора скриптов автосохранения (используя Maya 2014), но он очень нестабилен и может дать сбой, если что-то произойдет одновременно с сохранением. Я также только что понял, что сбои будут происходить даже без сохранения, поэтому я попытался найти, в чем была реальная проблема, и в итоге почти не осталось кода, но все же смог воспроизвести его.
Моя идея для кода состоит в том, чтобы запустить фоновый поток, в котором он будет зацикливаться и создавать резервные копии сценариев с интервалом, но проверять значение каждую секунду, чтобы убедиться, что оно не было приостановлено или отменено (отмена остановит цикл).
Я предполагаю, что проблема связана с тем, как фоновые потоки работают в Maya, так как это может привести к сбою при загрузке/закрытии окна редактора скриптов или переключении вкладок в настройках представления рендеринга (по крайней мере, с выбранным Mental Ray, так как кажется, что это занимает более длительная загрузка вкладок, чем средство визуализации по умолчанию). Я предполагаю, что есть и другие способы, но это те, которые было действительно легко найти.
После того, как он сократился до time.sleep()
в цикле while, мне действительно не понятно, почему это должно вызывать сбой. Я также использовал другую функцию сна, которая выполняет 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];
}
}
}