падает при перезапуске (но перезапускается при этом корректно)
И у меня такое же поведение. Вообще, воспроизводится падение так: открываю документ, работаю с ним от 40 секунд и больше, сохраняю, перезапускаю скриптом - упал. Но скриптом AutoSaveSession я не пользуюсь.
От порядка тех строк не зависит
Действительно, потом возобновились падения. Пока мне удалось, на ощупь по-дилетантски, решить проблему следующим образом. В скрипте Restart.js перед последним обращением к плагину Sessions
Infocatcher
Числа совпадают, но синтаксис отличается (lParam и возвращаемое значение). Числа постарался сделать одинаковыми, именно на случай невнимательности разработчиков (включая меня)
Posted: Thu Mar 06, 2014 7:58 am
by yozhic
Instructor
У вас используется не последняя версия скрипта
Ух, простите, шум такой поднял, а оказалась простая невнимательность С последней версией всё как часы работает.
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var lpTimerCallback=0;
var nIDEvent=10;
var hScript;
if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
//Script is running, second call close it.
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
if (AkelPad.WindowSubClass(2 /*WSC_EDITPROC*/, EditCallback, 0x100 /*WM_KEYDOWN*/))
{
//Allow other scripts running.
AkelPad.ScriptNoMutex();
//Message loop.
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(2 /*WSC_EDITPROC*/);
}
}
function EditCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 0x100 /*WM_KEYDOWN*/)
{
//User press S key
if (wParam == 83 /*s*/)
{
//Set timer
if (!lpTimerCallback)
{
if (lpTimerCallback=oSys.RegisterCallback("TimerProc"))
oSys.Call("user32::SetTimer", hMainWnd, nIDEvent, 1000, lpTimerCallback);
}
}
//User press D key
else if (wParam == 68 /*d*/)
{
//Destroy timer
if (lpTimerCallback)
{
oSys.Call("user32::KillTimer", hMainWnd, nIDEvent);
oSys.UnregisterCallback(lpTimerCallback);
lpTimerCallback=0;
}
}
}
}
function TimerProc(hWnd, uMsg, nIDEvent, dwTime)
{
oSys.Call("user32::SetWindowText" + _TCHAR, hMainWnd, "" + dwTime);
}
Posted: Thu Mar 06, 2014 4:36 pm
by Infocatcher
Instructor wrote:В скрипте используется ActiveXObject("htmlfile") для таймера. В данном случае предпочтительно без стороннего объекта (возможно падения исчезнут)
Эх, видимо, придется. Спасибо за пример.
Просто все эти штуки неудобны в использовании из-за вот этого
То есть нужна глобальная функция и как-то даже сходу не придумать, как без eval() сделать полноценный аналог setTimeout(). В данном случае, конечно, это излишне, но тем не менее.
Я правильно понимаю, что одноразовые таймеры не предусмотрены, и нужно делать так: