2013-06-14 24 views
8

Próbuję załadować wstępnie wykonanego skryptu Pascal RemObjects w Delphi w czasie wykonywania. Jednak, gdy próbuję załadować to Delphi oprócz "Nie mogę zaimportować VALUE_TEAMCODE." Value_TeamCode to funkcja w mojej aplikacji Delphi, którą już zarejestrowałem w Pascal Script.Ładowanie skompilowanego skryptu w RemObjects Pascal Script (Delphi)

Oto, co robię. Pseudo-kod poniżej - rzeczywisty kod jest podzielony na wiele plików. Również poniższe zgłoszenie SetCompiled występuje znacznie później w aplikacji, gdy skrypt jest wymagany do uruchomienia.

Uwaga dotycząca kodu: FPascalScript jest TPSScriptDebugger

... 

//Register custom functions with Pascal Script 
FuncsRegister; 

//Load script 
FPascalScript.Script.AddStrings(AContent); 

//Compile script 
FPascalScript.Compile; 

//Get compiled script 
FPascalScript.GetCompiled(sCompiledScript) 

//Try and set script back in - ERROR Here 'Cannot Import VALUE_TEAMCODE' 
FPascalScript.PascalScript.Debugger.SetCompiled(sCompiledScript); 

... 

Może mam zamiar o tym błędzie. Nie jestem pewien, czy można załadować wstępnie skompilowany skrypt.

Wyszukiwanie w witrynie RemObjects WebSite Wiki, ale pomoc programu Pascal Script została usunięta. Też szukałem różnych tematów tutaj na StackOverflow, ale żaden nie wydaje się być związany z tym problemem.

Jeszcze jedna uwaga. Mam już skrypty kompilujące i wykonujące w czasie wykonywania bez żadnych problemów. Muszę wstępnie skompilować ze względu na wydajność.

Każda pomoc doceniona.

Aktualizacja:

Obecna praca wokół jest mieć jeden silnik skryptowy za scenariusz w moim systemie. Silniki te pozostają w pamięci po wstępnej kompilacji. Usuwa to 30 ms na kompilację skryptu, które miałem inaczej. Wykorzystuje również nieco więcej pamięci, ale nie na tyle, aby być powodem do niepokoju.

Chciałbym jeszcze raczej używać tylko jeden silnik skryptowy chociaż. (Stąd potrzeba, aby załadować wstępnie skompilowany skrypt)

+0

Czy jesteś pewien, że wiki/dokumentacja została usunięta? Wyszukiwane przez Google "Dokumentacja skryptu Pascal RemObjects" zabrało mnie na [przydatną stronę] (https://github.com/remobjects/pascalscript/wiki). –

+0

Tak, czytam je. Niestety wyjaśniają więcej, jak działa skrypt i jak rejestrować klasy, metody itp. Mam już teraz pracę - w zasadzie jeden obiekt skryptu na skrypt, który pozostaje w pamięci po wstępnej kompilacji. –

+0

Po prostu na zewnątrz lub ciekawość ... Co spowodowało, że wybrałeś RO paskaluksa nad DWS? Poleciłbyś to? –

Odpowiedz

1

Dzięki odpowiedzi na forum dyskusyjnym RemObject Connect mam rozwiązanie. (Dla postu patrz http://connect.remobjects.com/discussion/comment/13540#Comment_13540)

Podziękowania dla plakatu vovanl.

musiałem importować swoje funkcje poprzez imprezy OnExecImport następująco:

... 

FPascalScript.OnExecImport := OnExecImport; 
FPascalScript.SetCompiled(sCompiledScript); 

... 

TMyClass.OnExecImport(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter); 
begin 
    se.RegisterDelphiFunction(@Value_TeamCode, 'Value_TeamCode', cdRegister); 
end; 

... 

Wydaje się SetCompiled usuwa wszystkie istniejące rejestracje a więc musisz zahaczyć OnExecImport do ponownej rejestracji funkcje, procedury, metody itd

Pamiętaj, że wygląda na to, że ładowanie wstępnie skompilowanego skryptu (np. Zmiana jednego skryptu na inny) wydaje się zwiększać dodatkowy czas. Zauważyłem, że moja początkowa praca jest w rzeczywistości szybsza o około 6 razy.

0

Zamiast how to, mam zamiar przeciwstawić się dlaczego?

Skompilowane skrypty najprawdopodobniej będą powiązane z wersją, prawdopodobnie nawet na platformie/celu - i zwykle kompilują się wystarczająco szybko, aby nigdy nie zauważyć czasu trafienia. Czy naprawdę używasz skryptów na tyle intensywnie, że czas kompilacji jest problemem?

Czasami najlepszą odpowiedzią jest "czy naprawdę musisz to zrobić w ogóle?"

+0

jeśli używa go na serwerze sieciowym, a ładowanie skompilowanego skryptu jest szybsze niż proces parsowania i kompilacji, to musi, nawet jeśli 5 ms zyskało IMO. – ComputerSaysNo

+0

To nie jest odpowiedź. Jest to (dobry) komentarz do pierwotnego pytania, ale nie robi nic, aby odpowiedzieć na zadane tutaj pytanie. –

+0

Dlaczego jest z powodów wydajności. Moja aplikacja jest krytyczna w czasie, a dodatkowe koszty zwiększają się. Kompilacja w czasie potrzeby trwa 30ms. Mam zestaw 20 dziwnych skryptów. To zajmuje 600ms. W tej chwili mam jednak do wykonania pracę - zasadniczo jeden obiekt skryptu na skrypt, który pozostaje w pamięci po wstępnej kompilacji. W ten sposób nie muszę ładować skryptów. Wykorzystuje więcej pamięci, ale nie na tyle, aby być powodem do niepokoju. Wolałbym jednak użyć tylko jednego silnika skryptowego. –