Проблема со списками

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

Проблема со списками

Postby Tez » Fri, 01 Apr 2005, 01:51

У меня есть проблемы с доступностью списка (ERROR_ACCESS_DENIED; ещё бывает не выполняется, а здорово проц загружает, и если потом повторно повторить последнее действие (см. ниже) тогда ТАК ЗАГРУЗИТ ПРОЦ… мама не горюй).
Зависимости от места определения list нету (в плагине, в кронтабе, в задаче, как сейчас).

Проблема проявляется если:
– Запустить сначала задачу test, потом test-main. И иногда наоборот.
– Два раза запускать только test-main.
– Иногда запуск test после test-main приводит к исключению.

У себя я пробовал даже в безопасном режиме Windows как приложение без плагинов, с конфигурацией по умолчнию и с единственным кронтабом:
Code: Select all
<%
VARIABLE flag
\ VARIABLE list
%>

#( test
VARIABLE list
NoActive
Action:
flag ON
111 list AppendNode
THINT: "test#1 done" 2
)#

#( test-main
NoActive
CREATE buff 256 ALLOT
: dummy NodeValue . ;
Action:
flag @ NOT IF 111 list AppendNode THEN

S" DoList " buff ZPLACE
['] dummy list ['] DoList CATCH
N>S buff +ZPLACE CRLF buff +ZPLACE

S" InList? " buff +ZPLACE
111 list ['] InList? CATCH NIP
N>S buff +ZPLACE CRLF buff +ZPLACE

S" NodeValue " buff +ZPLACE
list @ ['] NodeValue CATCH NIP
N>S buff +ZPLACE CRLF buff +ZPLACE

S" AppendNode " buff +ZPLACE
222 list ['] AppendNode CATCH
N>S buff +ZPLACE CRLF buff +ZPLACE

S" AddNode " buff +ZPLACE
333 list ['] AddNode CATCH
N>S buff +ZPLACE CRLF buff +ZPLACE

S" DelNode " buff +ZPLACE
111 list ['] DelNode CATCH
N>S buff +ZPLACE buff 0 MsgBox
)#
Мне сейчас никак не удается воспроизвести, но как-то, CATCH корректно перехватили исключения. Интересно, что в тот раз исключения не было, кажется, в AddNode (но возможно или в AppendNode или в NodeValue; в каком-то одном).

nncron.exe v 1.89 Build 997 20.05.2004
tm.exe v 1.89 Build 400 20.05.2004
Windows XP (5.1.2600) Service Pack 2
shell32.dll 6.0.2900
Tez
 
Posts: 205
Joined: Mon, 23 Aug 2004, 09:17
Location: Moscow

Postby Nicholas_Nemtsev » Fri, 01 Apr 2005, 08:36

Дело в том, что элементы, добавляемые во второй задаче, из первой задачи доступны только до тех пор, пока работает вторая. В другое время, они могут быть доступны какое-то время, т.к. память при освобождении не очищается. Если хочешь чтобы было доступно везде, заключай добавление/удаление в скобки GLOBAL ... LOCAL, тогда будет использоваться глобальная для процесса куча, но тогда надо не забывать об освобождении больше неиспользуемой глобальной памяти во избежание утечек.
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby Tez » Fri, 01 Apr 2005, 13:40

Вот спасибо! :weedman:
Насчёт освобождения, это вот так? например:
Code: Select all
     111 list InList? ?DUP
   IF
    GLOBAL
    111 list DelNode
    FREE DROP
    LOCAL
   THEN
Вообще, это всё само просится в доки.
Tez
 
Posts: 205
Joined: Mon, 23 Aug 2004, 09:17
Location: Moscow

Postby Tez » Fri, 15 Apr 2005, 02:18

Полез в исходники за TASK-LIST. И нашёл искомое.
Непосредственно освобождению FREE не нужен. Только GLOBAL DelNode LOCAL
Tez
 
Posts: 205
Joined: Mon, 23 Aug 2004, 09:17
Location: Moscow

Postby Nicholas_Nemtsev » Fri, 15 Apr 2005, 07:55

Не нужно (не обязательно) освобождать блоки, выделенные в локальной куче потока. Глобальные блоки необходимо освобождать, если не хочется утечек.
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby Mih.sys » Sat, 14 May 2005, 14:20

VARIABLE ms
Ok
S" 10a" S>ZALLOC ms AppendNode
Ok
S" 10a" S>ZALLOC ms InList? .
0 Ok

А все-таки, как правильно использовать InList?

И еще странно:
Z" 11a" ms AppendNode
Ok
ms @ @ NodeValue ASCIIZ> TYPE CR
@ @ NodeValue ASCIIZ> TYPE CR
Ok

а с S" 11a" S>ZALLOC ms AppendNode работает...
Mih.sys
 
Posts: 20
Joined: Wed, 06 Oct 2004, 07:44

Postby Nicholas_Nemtsev » Sat, 14 May 2005, 15:33

Mih.sys wrote:А все-таки, как правильно использовать InList?

В качестве значения в списке может быть произвольный объект, который представляется одним числом. В данном случае в списке запоминается и потом сравнивается адрес строки. При двух S>ZALLOC адреса, естественно, будут разные.
Mih.sys wrote:И еще странно:
а с S" 11a" S>ZALLOC ms AppendNode работает...

Ничего странного. Строка из буфера ввода нигде не запоминается и затирается последующим вводом.
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby Mih.sys » Sat, 14 May 2005, 17:42

Nicholas_Nemtsev wrote:В качестве значения в списке может быть произвольный объект, который представляется одним числом. В данном случае в списке запоминается и потом сравнивается адрес строки.

А в документации wrote:Последний элемент списка не содержит ссылки и возвращает ноль при попытке узнать, адрес следующего элемента.

Хорошо бы тут адрес обозвать идентификатором, хотя из существования NodeValue, если подумать, следует что это действительно не адрес строки...
Mih.sys
 
Posts: 20
Joined: Wed, 06 Oct 2004, 07:44

Postby Tez » Mon, 16 May 2005, 08:45

Хорошо бы тут адрес обозвать идентификатором, хотя из существования NodeValue, если подумать, следует что это действительно не адрес строки...
Эта часть/элемент массива содержит адрес (и не важно чего, адрес он и в африке адрес).
Tez
 
Posts: 205
Joined: Mon, 23 Aug 2004, 09:17
Location: Moscow

Postby Mih.sys » Mon, 16 May 2005, 09:22

Понял. Прежде чем вносить строку в список, надо продублировать ее адрес, сделать с ней все что надо, запомнить ее адрес где-то еще, а потом юзать InList? на запомненном адресе.
Если список создается сначала, а потом в нем ищутся сходные по содержанию строки, то InList? не поможет - нужно сочинять новые слова c COMPARE для DoList.
Сенькс, понял, no problem
Mih.sys
 
Posts: 20
Joined: Wed, 06 Oct 2004, 07:44

Postby Tez » Tue, 17 May 2005, 04:05

Понял. Прежде чем вносить строку в список, надо продублировать ее адрес, сделать с ней все что надо, запомнить ее адрес где-то еще, а потом юзать InList? на запомненном адресе.

Э-э-э... теперь я не понял. :| Если в переменной есть адрес строки, нафига тогда список, если по этому адресу уже лежит искомая строка и её можно в любой момент использовать (ASCIIZ> etc...)

Если список создается сначала, а потом в нем ищутся сходные по содержанию строки, то InList? не поможет - нужно сочинять новые слова c COMPARE для DoList.

Точно.

А ещё можно компилировать и прямо в задаче:
[NONAME NodeValue TYPE CR NONAME] list DoList

Знаешь, хочешь работать с чем-то новым для себя - загляни в плагины: узнай сперва как Валерий или Николас это делают (ещё в иходниках бывают интересности).
Tez
 
Posts: 205
Joined: Mon, 23 Aug 2004, 09:17
Location: Moscow


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests

cron