Плагин lists.spf [15/08/2013 21:40]

Обсуждение программ nnCron и nnCron LITE

Re: Плагин lists.spf

Postby Morituruz » Tue, 10 Jan 2012, 18:10

Глобальный список получается можно не очищать. Не очень понятно, зачем мне нужен простой (конкурентные преимущества?), если его в каждый вызов задачи нужно заполнять и очищать :)
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Tue, 10 Jan 2012, 18:51

Если содержимое списка статическое - то да, можно в начале кронтаба создать и заполнить между <% %> и далее читать его содержимое в задачах. Заголовок именованных списков статичен - соответственно и ведет он себя как VARIABLE-переменная.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby VoidVolker » Tue, 10 Jan 2012, 19:13

USER-списков не будет. Связано с тем, что списку необходима инициализация, а в данном случае память выделяется только при запуске задачи. Следовательно необходимо будет добавить код для контроля инициализации списков при запуске задачи. А это слишком большое усложнение.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Game Mode

Postby Morituruz » Thu, 12 Jan 2012, 01:06

Пример использования, только он не работает: NODE-DEL выдаёт ошибку:
Code: Select all
<%
GLOBAL-STRING-LIST: games
GLOBAL-LIST: gamesPID
" quake3.exe" games!
" hl.exe" games!
" Crysis.exe" games!
" hl2.exe" games!
" GTAIV.exe" games!
" UT3.exe" games!
" cnq3.exe" games!
" nfsc.exe" games!
" defcon.exe" games!
%>

#( CLASSIC-TASK-#-WatchProc
HyperActive
WatchProc: "*"
Action:
WATCH-PROC-ID PROC-NAME games LIST?
IF
   WATCH-PROC-ID gamesPID!
   DISABLE-CRON
THEN
)#

#( CLASSIC-TASK-#-quit_game_mode
HyperActive
WatchProcStop: "*"
Action:
WATCH-PROC-ID gamesPID LIST?
IF
   WATCH-PROC-ID gamesPID NODE-DEL
   ENABLE-CRON
THEN
)#

gamesPID пришлось делать потому, что по закрытию процесса PROC-NAME не определяется. Можно конечно не удалять конкретную ноду, а сразу gamesPID LIST-FREE, но это как-то неправильно.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Thu, 12 Jan 2012, 16:36

Ап! Исправлена ошибка в NODE-DEL. Вообще, это слово следует использовать в тех случаях, когда нет возможности использовать цикл LIST( )LIST. Вот так будет гораздо проще и эффективнее:
Code: Select all
gamesPID(
  WATCH-PROC-ID NODE@ =
  IF
    NDEL ENABLE-CRON
  THEN
)gamesPID

Еще можно и вот так:
Code: Select all
games[ " quake3.exe" " hl.exe" " Crysis.exe" " hl2.exe" " GTAIV.exe" " UT3.exe" " cnq3.exe" " nfsc.exe" " defcon.exe" ]games

А вместо:
Code: Select all
games LIST?

и
Code: Select all
gamesPID LIST?

Можно просто:
Code: Select all
games?

Code: Select all
gamesPID?

Специально же использовал автостроки для автогенерации слов для удобной работы со списками.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby SphinxST » Thu, 12 Jan 2012, 18:50

Можно поподробнее про глобальные и локальные списки?
Мое понимание что STRING-LIST доступен только в текущей задаче, а GLOBAL-STRING-LIST - для всех. В мануале написано "Динамически выделяет и освобождает для строк память." для обоих, т.е. кроме области видимости никаких других отличий нет в использовании?

Причина вопроса, что при переносе глобального списка в локальный он портится.
Т.е. такой код работает
Code: Select all
<%
\ List of folders for unidirectional sync (text, from, to)
: pl_LAPTOP_Phone_Sync_Desk   \ ( -- a u ... an un )
   " Starting DropBox sync"
   " %PHONE_DIR_LOCAL%\Storage_Card\Dropbox"
   " %PHONE_DIR_DESK%\Storage_Card\Dropbox"

   " Starting Finance sync"
   " %PHONE_DIR_LOCAL%\Storage_Card\My Documents\Finance"
   " %PHONE_DIR_DESK%\Storage_Card\My Documents\Finance"
;

GLOBAL-STRING-LIST: p_LAPTOP_Phone_Sync_Desk
p_LAPTOP_Phone_Sync_Desk[ pl_LAPTOP_Phone_Sync_Desk ]p_LAPTOP_Phone_Sync_Desk
%>

#( _LAPTOP_Phone_Sync_Desk
NoActive
LoadProfile
Action:
p_LAPTOP_Phone_Sync_Desk--
BEGIN p_LAPTOP_Phone_Sync_Desk@ NIP WHILE
   " === %CUR-TASK-NAME% === %p_LAPTOP_Phone_Sync_Desk@>%|n" " %PHONE_BACKUP_LOG%" FAPPEND

   " %NNBACKUP_FN% sync -i |q%p_LAPTOP_Phone_Sync_Desk@>%|q -o |q%p_LAPTOP_Phone_Sync_Desk@>%|q -c -s -e -v -ad -da -log |q%PHONE_BACKUP_LOG%|q" START-APPW
REPEAT
)#

Вывод (см параметр -i второй команды):
Code: Select all
17:42:07 24980 SEMENT Start: c:\!ST\Tools\nn\nnBackup\nnbackup.exe sync -i "C:\!ST\!Phone\Storage_Card\Dropbox" -o "z:\!ST\!Phone\Storage_Card\Dropbox" -c -s -e -v -ad -da -log "z:\!ST\!Phone\..\phone_sync.log"
17:42:52 24980 SEMENT Start: c:\!ST\Tools\nn\nnBackup\nnbackup.exe sync -i "C:\!ST\!Phone\Storage_Card\My Documents\Finance" -o "z:\!ST\!Phone\Storage_Card\My Documents\Finance" -c -s -e -v -ad -da -log "z:\!ST\!Phone\..\phone_sync.log"
17:42:59 24980 SEMENT Start: c:\!ST\Tools\nn\nnBackup\nnbackup.exe sync2 -i "C:\!ST\!Phone" -o "z:\!ST\!Phone" -s -e -v -log "z:\!ST\!Phone\..\phone_sync.log"

А такой - нет
Code: Select all
#( _LAPTOP_Phone_Sync_Desk
NoActive
LoadProfile
: pl_LAPTOP_Phone_Sync_Desk   \ ( -- a u ... an un )
   " Starting DropBox sync"
   " %PHONE_DIR_LOCAL%\Storage_Card\Dropbox"
   " %PHONE_DIR_DESK%\Storage_Card\Dropbox"

   " Starting Finance sync"
   " %PHONE_DIR_LOCAL%\Storage_Card\My Documents\Finance"
   " %PHONE_DIR_DESK%\Storage_Card\My Documents\Finance"
;

STRING-LIST: p_LAPTOP_Phone_Sync_Desk
p_LAPTOP_Phone_Sync_Desk[ pl_LAPTOP_Phone_Sync_Desk ]p_LAPTOP_Phone_Sync_Desk
Action:
p_LAPTOP_Phone_Sync_Desk--
BEGIN p_LAPTOP_Phone_Sync_Desk@ NIP WHILE
   " === %CUR-TASK-NAME% === %p_LAPTOP_Phone_Sync_Desk@>%|n" " %PHONE_BACKUP_LOG%" FAPPEND

   " %NNBACKUP_FN% sync -i |q%p_LAPTOP_Phone_Sync_Desk@>%|q -o |q%p_LAPTOP_Phone_Sync_Desk@>%|q -c -s -e -v -ad -da -log |q%PHONE_BACKUP_LOG%|q" START-APPW
REPEAT
)#


Вывод(см параметр -i второй команды):
Code: Select all
17:38:21 26052 SEMENT Start: c:\!ST\Tools\nn\nnBackup\nnbackup.exe sync -i "C:\!ST\!Phone\Storage_Card\Dropbox" -o "z:\!ST\!Phone\Storage_Card\Dropbox" -c -s -e -v -ad -da -log "z:\!ST\!Phone\..\phone_sync.log"
17:39:05 26052 SEMENT Start: c:\!ST\Tools\nn\nnBackup\nnbackup.exe sync -i "/" -o "z:\!ST\!Phone\Storage_Card\My Documents\Finance" -c -s -e -v -ad -da -log "z:\!ST\!Phone\..\phone_sync.log"
17:39:14 26052 SEMENT Start: c:\!ST\Tools\nn\nnBackup\nnbackup.exe sync2 -i "C:\!ST\!Phone" -o "z:\!ST\!Phone" -s -e -v -log "z:\!ST\!Phone\..\phone_sync.log"
SphinxST
 
Posts: 18
Joined: Thu, 17 Nov 2011, 12:27

Re: Плагин lists.spf

Postby VoidVolker » Thu, 12 Jan 2012, 19:25

В локальный список следует добавлять узлы в разделе Action:, а не до него. Кронтабы интерпретирует один поток, а вот задачи ннкрон запускает отдельными потоками. Таким образом во втором случае следует делать так:
Code: Select all
#( _LAPTOP_Phone_Sync_Desk
NoActive
LoadProfile
STRING-LIST: p_LAPTOP_Phone_Sync_Desk
Action:
p_LAPTOP_Phone_Sync_Desk[
   " Starting DropBox sync"
   " %PHONE_DIR_LOCAL%\Storage_Card\Dropbox"
   " %PHONE_DIR_DESK%\Storage_Card\Dropbox"

   " Starting Finance sync"
   " %PHONE_DIR_LOCAL%\Storage_Card\My Documents\Finance"
   " %PHONE_DIR_DESK%\Storage_Card\My Documents\Finance"
]p_LAPTOP_Phone_Sync_Desk

BEGIN p_LAPTOP_Phone_Sync_Desk@ NIP WHILE
   " === %CUR-TASK-NAME% === %p_LAPTOP_Phone_Sync_Desk@>%|n" " %PHONE_BACKUP_LOG%" FAPPEND

   " %NNBACKUP_FN% sync -i |q%p_LAPTOP_Phone_Sync_Desk@>%|q -o |q%p_LAPTOP_Phone_Sync_Desk@>%|q -c -s -e -v -ad -da -log |q%PHONE_BACKUP_LOG%|q" START-APPW
REPEAT
)#

Сначала открываем консоль, потом добавляем вот эту задачу в кронтаб:
Code: Select all
#( TEST_TASK_INTERPRET_PID
NoActive
SingleInstance
.( CRONTAB READ TASK PID:) GetCurrentThreadId . CR
Action:
." TASK PID:" GetCurrentThreadId . CR
)#

Затем запускаем задачу и смотрим в консоль - сразу станет видно, что потоки разные.
SphinxST wrote:В мануале написано "Динамически выделяет и освобождает для строк память." для обоих, т.е. кроме области видимости никаких других отличий нет в использовании?

Да, единственное отличие - используются различные области памяти. Хип потока, доступный только для этого потока или глобальный хип, доступный для любого потока в процессе. Динамическое выделение памяти для строк - перед добавлением строки в список для неё выделяется новый блок памяти и строка в него копируется. Так что в список добавляется не сама строка, а её только что созданная копия, поэтому изменения исходной строки не изменят строку в списке. Это позволяет добавлять в список строки, получаемые во временных буферах в таких циклах как READ-BY-LINE, FOR-FILES, FOR-WINDOWS и т.д.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby VoidVolker » Thu, 12 Jan 2012, 20:57

Ап! Дополнения в документации. Более подробно описана разница между локальными и глобальными списками.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Mon, 16 Jan 2012, 20:38

Или я не так пользуюсь, или NODE>@ выдаёт ошибку:
Code: Select all
#( nodetest
STRING-LIST: nodes
NoLog
NoActive
SingleInstance
Action:
nodes[
" 123"
" 456"
]nodes
nodes# . CR
0 nodes NODE>@ TYPE CR
nodes LIST-FREE
)#
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Mon, 16 Jan 2012, 20:53

Там не индекс узла нужен, а сам узел (адрес). Для получения узла по индексу следует использовать слово LIST#@:
Code: Select all
0 nodes#@ TYPE CR

# - индекс, @ - извлечь.
Кстати, все это легко работает в консоли.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf [Обновление 16/01/2012 22:02]

Postby VoidVolker » Mon, 16 Jan 2012, 21:04

Ап! Добавлен подраздел "Условные обозначения".
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf [Обновление 16/01/2012 22:02]

Postby bender_523 » Wed, 18 Jan 2012, 13:15

не подскажите, как получить индекс узла, зная его адрес?
bender_523
 
Posts: 16
Joined: Fri, 03 Sep 2010, 22:57

Re: Плагин lists.spf [Обновление 16/01/2012 22:02]

Postby VoidVolker » Wed, 18 Jan 2012, 16:58

Ап! Добавлено новое слово:
NODE># ( node list -- i|-1 ) Вычислить индекс узла node списка list. Вернуть -1 в случае отсутствия узла в списке.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf [Обновление 18/01/2012 17:56]

Postby bender_523 » Wed, 18 Jan 2012, 17:40

to VoidVolker
:D класс, именно этого не хватало. спасиб, за отличную поддержку.
bender_523
 
Posts: 16
Joined: Fri, 03 Sep 2010, 22:57

Re: Плагин lists.spf [Обновление 18/01/2012 17:56]

Postby SphinxST » Thu, 26 Jan 2012, 12:29

Задача OFFICE_LAPTOP_Phone_Sync_App_Exit приведенная ниже прекрасно выполняется первый раз.
Во второй раз падает на строке
Code: Select all
   " === %CUR-TASK-NAME% === Starting full bi-directional sync|n" " %PHONE_BACKUP_LOG%" FAPPEND

Потом уже просто не запускается автоматом.
Выдает ошибку "11:13:25 11656 SEMENT CLASSIC-TASK-#-OFFICE_LAPTOP_Phone_Sync_App_Exit: Internal error. Error # -1073741819".
Подозреваю списки или автостроки, больше просто нечему.
Задача:
Code: Select all
#( _OFFICE_LAPTOP_Phone_Sync_Desk
   NoActive
   LoadProfile
   STRING-LIST: uniSyncList
   Action:
   " === _OFFICE_LAPTOP_Phone_Sync_Desk === Started" CRON-LOG

   \ List of folders for unidirectional sync (text, from, to)
   uniSyncList[
      " Starting DropBox sync"
      " %DROPBOX_LOCAL%"
      " %PHONE_DIR_DESK%\Storage_Card\Dropbox"

      " Starting Finance sync"
      " %PHONE_DIR_LOCAL%\Storage_Card\My Documents\Finance"
      " %PHONE_DIR_DESK%\Storage_Card\My Documents\Finance"
   ]uniSyncList

   uniSyncList--
   BEGIN uniSyncList@ NIP WHILE
      " === %CUR-TASK-NAME% === %uniSyncList@>%|n" " %PHONE_BACKUP_LOG%" FAPPEND

      " %NNBACKUP_FN% sync -i |q%uniSyncList@>%|q -o |q%uniSyncList@>%|q -c -s -e -v -ad -da -log |q%PHONE_BACKUP_LOG%|q" START-APPW
   REPEAT

   " === %CUR-TASK-NAME% === Starting full bi-directional sync|n" " %PHONE_BACKUP_LOG%" FAPPEND
   " %NNBACKUP_FN% sync2 -i |q%PHONE_DIR_LOCAL%|q -o |q%PHONE_DIR_DESK%|q -s -e -v -log |q%PHONE_BACKUP_LOG%|q" START-APPW

   " %PHONE_BACKUP_LOG%" START-APP

   " === _OFFICE_LAPTOP_Phone_Sync_Desk === Finished" CRON-LOG
)#

#( CLASSIC-TASK-#-OFFICE_LAPTOP_Phone_Sync_App_Exit
   RunMissed
   LoadProfile
   WatchProcStop: "TrueCrypt.exe"
   WatchProcStop: "msmoney.exe"
   WatchProcStop: "soffice.bin"
   WatchProcStop: "KeePass.exe"
   Rule:
      " TrueCrypt.exe" PROC-EXIST? NOT
      " msmoney.exe" PROC-EXIST? NOT AND
      " soffice.bin" PROC-EXIST? NOT AND
      " KeePass.exe" PROC-EXIST? NOT AND
      " nnbackup.exe" PROC-EXIST? NOT AND
      " %PHONE_DIR_DESK%" EXIST? AND
      " %PHONE_DIR_LOCAL%" EXIST? AND
      " %OFFICE_LAPTOP_NAME%" IS_CURRENT_PC? AND
   Action:
   BALLOON: "%CUR-TASK-NAME%" "Starting task"
   " === %CUR-TASK-NAME% === Started" CRON-LOG

   _OFFICE_LAPTOP_Phone_Sync_Desk RUN

   " === %CUR-TASK-NAME% === Finished" CRON-LOG
)#
SphinxST
 
Posts: 18
Joined: Thu, 17 Nov 2011, 12:27

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot], Yahoo [Bot] and 1 guest