Scripts discussion (2)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Infocatcher
падает при перезапуске (но перезапускается при этом корректно)
И у меня такое же поведение. Вообще, воспроизводится падение так: открываю документ, работаю с ним от 40 секунд и больше, сохраняю, перезапускаю скриптом - упал. Но скриптом AutoSaveSession я не пользуюсь.
От порядка тех строк не зависит
Действительно, потом возобновились падения. Пока мне удалось, на ощупь по-дилетантски, решить проблему следующим образом. В скрипте Restart.js перед последним обращением к плагину Sessions

Code: Select all

if(!AkelPad.IsPluginRunning("Sessions::Main")) ... 
я поставил 1,5 секундную паузу. Пока, со вчерашнего вечера ... падает, но значительно реже.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

yozhic
Если так попробовать?
var cmd = '"%nirCmd%" waitprocess /%pid% cmdwait 1000 exec2 show "%workDir%" "%akelExe%"';

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Instructor
Если так попробовать?
Вроде как падение происходит раньше. При обращении к плагину Sessions (если я правильно понимаю). Вот так это выглядит в System Explorer:
Image

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

yozhic
Можете выслать/выложить свою папку с AkelPad'ом?

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Instructor
Выслал почтой.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

yozhic
У вас используется не последняя версия скрипта. Попробуйте с последней версией.

Infocatcher
closeLeftOrRightTabs.js - можно было использовать AKD_GETMAININFO и MI_TABOPTIONSMDI.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:closeLeftOrRightTabs.js - можно было использовать AKD_GETMAININFO и MI_TABOPTIONSMDI.
Спасибо, обновил.

tabsRightLeft.js
tabsNextPrevious.js
tabsSwitchAlt.js

closeLeftOrRightTabs.js
Use AKD_GETMAININFO instead of menu trick

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »


Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher
Для AKD_SETMAININFO используется MIS_*.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:Для AKD_SETMAININFO используется MIS_*.
Ой, и правда.
А какой смысл их разделять, если числа те же?

[Upd] Подправил.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher
Числа совпадают, но синтаксис отличается (lParam и возвращаемое значение). Числа постарался сделать одинаковыми, именно на случай невнимательности разработчиков (включая меня) :)

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Instructor
У вас используется не последняя версия скрипта
Ух, простите, шум такой поднял, а оказалась простая невнимательность :( С последней версией всё как часы работает.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher

Code: Select all

	if(uMsg == 0x406 /*AKDN_MAIN_ONFINISH*/) {
		oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
		return;
	}
Этот кусок можно убрать. В последних версиях Scripts плагина он делает это самостоятельно.

В скрипте используется ActiveXObject("htmlfile") для таймера. В данном случае предпочтительно без стороннего объекта (возможно падения исчезнут):

Code: Select all

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);
}
Last edited by Instructor on Fri Mar 07, 2014 4:35 am, edited 2 times in total.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:В скрипте используется ActiveXObject("htmlfile") для таймера. В данном случае предпочтительно без стороннего объекта (возможно падения исчезнут)
Эх, видимо, придется. Спасибо за пример.
Просто все эти штуки неудобны в использовании из-за вот этого

Code: Select all

oSys.RegisterCallback("TimerProc")
То есть нужна глобальная функция и как-то даже сходу не придумать, как без eval() сделать полноценный аналог setTimeout(). В данном случае, конечно, это излишне, но тем не менее.

Я правильно понимаю, что одноразовые таймеры не предусмотрены, и нужно делать так:

Code: Select all

function TimerProc(hWnd, uMsg, nIDEvent, dwTime)
{
  oSys.Call("user32::KillTimer", hMainWnd, nIDEvent);
  ...
}
?

И при этом

Code: Select all

lpTimerCallback=oSys.RegisterCallback("TimerProc")
можно создать только один раз?

Этот _In_ UINT_PTR nIDEvent – вообще любое UINT число? Почему тогда 10, а не 1 или 0?

Пока вот так: https://github.com/Infocatcher/AkelPad_ ... c622b51be3
Вроде бы работает...

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:Этот _In_ UINT_PTR nIDEvent – вообще любое UINT число? Почему тогда 10, а не 1 или 0?
Не 0, потому что "A nonzero timer identifier". Не 1-9, потому что резерв для hMainWnd (вдруг появятся).
Locked