Page 1 of 1
как реализовать обмен данными из разных скриптов?
Posted: 08.11.2011 11:52
by uzver1234
Есть скрипт на лесоруба. Задаешь начальную точку, с нее начинает поиск деревьев, рубит, запоминает и ищет новые. Работает 3 скрипта одновременно. Как между ними сделать обмен инфы о уже рубленых деревьях?
Из идей пока только обмен через файлы. Считаю это неправильным:)
Надо передавать массив уже рубленных деревьев (тип тайла, х, у, z)
Re: как реализовать обмен данными из разных скриптов?
Posted: 08.11.2011 11:56
by Alex
Re: как реализовать обмен данными из разных скриптов?
Posted: 08.11.2011 12:03
by uzver1234
Читал.
Как ты предлагаешь передать массив из 100х4 элементов через SetGlobal?
Re: как реализовать обмен данными из разных скриптов?
Posted: 08.11.2011 12:19
by uzver1234
uzver1234 wrote:
Читал.
Как ты предлагаешь передать массив из 100х4 элементов через SetGlobal?
Сори, поточнее, можно и так. Но как я понял SetGlobal создает переменную 1, не массив и придется обрабатывать 400 строк на скрипт. В моем случа это 1200 переменных с уникальным именем.
Re: как реализовать обмен данными из разных скриптов?
Posted: 08.11.2011 13:14
by Alex
да, SetGlobal принемает только строку как возможное значение, что бы массив туда загонять придется присать конвертеры из массива в строку и обратно, к примеру знаком | разделять значения из массива а потом StrBreakApart что бы развернуть обратно
Re: как реализовать обмен данными из разных скриптов?
Posted: 08.11.2011 13:20
by uzver1234
Alex wrote:да, SetGlobal принемает только строку как возможное значение, что бы массив туда загонять придется присать конвертеры из массива в строку и обратно, к примеру знаком | разделять значения из массива а потом StrBreakApart что бы развернуть обратно
Тоже идея, попробую на неделе. Если получиться выложу код.
Есть ограничение на длину строки?
Re: как реализовать обмен данными из разных скриптов?
Posted: 08.11.2011 15:20
by chobi0ne
Я думаю дабы не забивать память сетглобалом, лучше записывать всю нужную информацию в файл, а потом другим скриптом считывать из этого файла. Написать функцию, которая будет загонять данные из файла в массив.
Всё-таки, сетглобал в таких объемах я бы не рискнул использовать

Re: как реализовать обмен данными из разных скриптов?
Posted: 08.11.2011 16:30
by CFA
Около 20 тысяч символов он переварит без проблем, больше не пробовал но как минимум ограничение может быть порядка 65к символов, но скорее всего и такого нет.
Проблемы могут быть при одновременном изменении глобалки несколькими скриптами - какие то изменения могут потеряться, но думаю пара потерянных тайлов это не проблема. А вот с файлами в этом плане проблем может быть больше.
Чтоб себя хоть как то обезопасить я использовал две таких процедурки:
Code: Select all
procedure lock(cs : string);
begin
repeat
wait(randomRange(100, 500));
if (getGlobal('stealth', cs) = '') then
begin
setGlobal('stealth', cs, 'lock');
break;
end;
until false;
end;
procedure unlock(cs : string);
begin
setGlobal('stealth', cs, '');
end;
100% гарантии не дают, но количество коллизий уменьшают в разы, первая вызывается перед использованием глобальных переменных, вторая когда все операции с ними завершены.
Re: как реализовать обмен данными из разных скриптов?
Posted: 08.11.2011 17:17
by uzver1234
CFA wrote:Около 20 тысяч символов он переварит без проблем, больше не пробовал но как минимум ограничение может быть порядка 65к символов, но скорее всего и такого нет.
Отлично.
CFA wrote:Проблемы могут быть при одновременном изменении глобалки несколькими скриптами - какие то изменения могут потеряться, но думаю пара потерянных тайлов это не проблема. А вот с файлами в этом плане проблем может быть больше.
Я не буду использовать 1 переменную. На каждый скрипт свою. Надо чтоб скрипт потом еще тер за собой. Именно свои записи.
Спасибо за идеи, когда напишу реализацию выложу:)
Re: как реализовать обмен данными из разных скриптов?
Posted: 11.11.2011 2:44
by uzver1234
Code: Select all
procedure SetA;
var
SL:TStringList;
i:Integer;
begin
SL:=TStringList.Create;
for i:=0 to Length(TMPA)-1 do
SL.Append(TimeToStr(TMPA[i].time)+' '+IntToStr(TMPA[i].tile )+' '+IntToStr(TMPA[i].x)+' '+IntToStr(TMPA[i].y)+' '+IntToStr(TMPA[i].z));
SetGlobal('stealth','TestVar1',SL.Text);
SL.free;
end;
Code: Select all
procedure GetA;
var
List : TStringList;
i : integer;
s : string;
begin
List := TStringList.Create;
List.text:=GetGlobal('stealth','TestVar1');
SetLength(TMPA,1);
for i := 0 to List.Count-1 do begin
s := List.strings[i] + ' ';
TMPA[i].time := StrToTime(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
TMPA[i].tile := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
TMPA[i].x := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
TMPA[i].y := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
TMPA[i].z := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
end;
end;
Пока так:))