Asynchroner Skriptstart

Hier ist der ideale Ort um über Scripts und Mods für X³: Terran Conflict und X³: Albion Prelude zu diskutieren.

Moderators: Moderatoren für Deutsches X-Forum, Scripting / Modding Moderators

User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Asynchroner Skriptstart

Post by Reflexer »

Hallo Leute,

die Probleme mit den Skriptstarts nehmen irgendwie kein Ende.

Gehe ich recht in der Annahme, dass die einzige Möglichkeit ein Script asynchron zu starten der Befehl

Code: Select all

START <RefObj> call script <Script Name> : <Parameter>
ist? Der Befehl

Code: Select all

<RefObj> -> start task <Var/Number> with script <Script Name> and prio <Var/Number>: arg1=<value> arg2=<value> arg3=<value> arg4=<value> arg5=<value> 
startet das Script synchron, oder?

Wie starte ich nun also auf einer Station ein Script asynchron auf einem speziellen Task?

Warum möchte ich das tun? Nun - ich benötige ein "endlos" laufendes Skript, von dem ich die TaskID kenne um es auch beenden zu können, welches auf einem Komplexzentrum läuft. Dieses soll auf Anforderung allerdings auch wieder beendet werden können.

Womit wir zu einer weiteren Frage kommen. Besteht eine Möglichkeit ein Script von außen zu beenden? Interrupt unterbricht es ja nur. Ich möchte es aber von außen beenden können.... Ansonsten besteht ja schon ein kleines Problem mit "endlos"-Scripts....

Gruß
Reflexer
wingcommander1
Posts: 89
Joined: Thu, 6. Sep 07, 10:55
x3tc

Post by wingcommander1 »

Du kannst als Schleifenbedingung den Wert einer globalen(bzw. lokalen) Variable nehmen und diese von außen beeinflussen.
Also in jedem Schleifendurchlauf die globale Variable auslesen und ihren Wert in der Schleifenbedingung prüfen. Wenn du dass Skript beenden willst setzt du die globale Variable von außen auf einen Wert der zu einem beenden der Schleife führt.
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

Ja einen Work-Around in der Art habe ich mir auch schon überlegt. Wollte nur wissen, ob es auch anders geht.

Die gV hätte ich als nächstes genommen. Iss nur doof bei jedem Durchlauf ein Array durchzuackern um zu schauen, ob auf DIESER Station das Script beendet werden soll...
wingcommander1
Posts: 89
Joined: Thu, 6. Sep 07, 10:55
x3tc

Post by wingcommander1 »

wenn du eine lokale variable nimmst hast du das problem nicht
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »


Wenn dir die TaskID bekannt ist, dann kannst du das Skript auch auf dem Task "killen".

... -> start task <TaskID> with script <Leer-Script> and prio ...

<Leer-Script>
001 return null

Was meinst du mit synchron und asynchron? Womit soll das Skript synchron oder asynchron laufen?

Gruß
Lucike
Image
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

Reflexer wrote:Ja einen Work-Around in der Art habe ich mir auch schon überlegt. Wollte nur wissen, ob es auch anders geht.

Die gV hätte ich als nächstes genommen. Iss nur doof bei jedem Durchlauf ein Array durchzuackern um zu schauen, ob auf DIESER Station das Script beendet werden soll...
START <RefObj> call script <Script Name> : <Parameter> starten auf task 0 und somit nicht das was du suchst bzw suchen solltest.

alternativen gibt es ein paar zum beispiel: [THIS] -> start task xxx with script 'xxx' and prio xxx: arg1=null arg2=null arg3=null arg4=null arg5=null

nimm ne global var die du einfach nur an oder aus machen brauchst oder du legts auf pos 1 des arrays dein gewünschten trigger fertig

Edit: Man war wieder der langsamste ...ich werde alt. zum doppelten / mehrfachen ausführen: damit´s nur einmal gecallt wird oder läuft bau ein skip if not ein sprich:

skip if not get global variable=xxx
|return null

oder so
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

ok....

ich habe ein Script geschrieben, welches die "Ich gammle hier nur rum"-Schiffe aus den Komplexzentren entfernt um Platz für die 100 Schiffe, die darauf warten andocken zu können, macht. Dieses Script wird im Kommandomanü des Komplexzentrums gestartet und läuft endlos. - Oder eben bis man es von Hand beendet. Die Prüfung auf "Gammler" erfolgt alle 10 Minuten. Ein Durchlauf dauert quasi 10 Minuten.

Das Script kann auf allem Kontrollzentren laufen und ist somir nFach gestartet, auf jedem KZ allerdings nur einmal.

Wenn ich das Script nun beenden möchte, muss ich es ja von "außen" beenden. Ich werde nun vermutlich eine gV nehmen, welche ich dann bei jedem durchlauf prüfe. Eine lokale Variable geht ja in dem Fall nicht.

Synchron und asynchron: Wie es der Name sagt. Asynchron läuft es, wenn man es parallel startet und das aufrufende Script danach weiterläuft. Synchron ist in dem Fall "sequenziell" - sprich das aufrufende Script waretet, bis das zweite fertig ist. Und das geht ja bei "endlos-Scripts" nicht, da das System sonst steht ;)

Eine Frage habe ich noch.... wie lasse ich im Komandomenü von Stationen anzeigen, dass das Script läuft.... das Handelsverbot des HVT und des Universumshändlers von Lucike macht sowas....

Gruß
Reflexer
wingcommander1
Posts: 89
Joined: Thu, 6. Sep 07, 10:55
x3tc

Post by wingcommander1 »

eine lokale Variable geht schon ^^
weiße z.B. auf die Variable $kompCenter das Komplexzentrum zu
dann kannst du mit $kompCenter->set local variable .... deren wert verändern
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

Code: Select all

 [THIS] -> start task xxx with script 'xxx' and prio xxx: arg1=null arg2=null arg3=null arg4=null arg5=null 
startet aber meines wissen kein asychrones script, sondern das aufrufende Script "wartet".... -> bei "Endlos"-Scripts wird das System in diesem Fall stehenbleiben...

Oder irre ich mich?
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

Reflexer wrote:ok....

ich habe ein Script geschrieben, welches die "Ich gammle hier nur rum"-Schiffe aus den Komplexzentren entfernt um Platz für die 100 Schiffe, die darauf warten andocken zu können, macht. Dieses Script wird im Kommandomanü des Komplexzentrums gestartet und läuft endlos. - Oder eben bis man es von Hand beendet. Die Prüfung auf "Gammler" erfolgt alle 10 Minuten. Ein Durchlauf dauert quasi 10 Minuten.

Das Script kann auf allem Kontrollzentren laufen und ist somir nFach gestartet, auf jedem KZ allerdings nur einmal.

Wenn ich das Script nun beenden möchte, muss ich es ja von "außen" beenden. Ich werde nun vermutlich eine gV nehmen, welche ich dann bei jedem durchlauf prüfe. Eine lokale Variable geht ja in dem Fall nicht.

Synchron und asynchron: Wie es der Name sagt. Asynchron läuft es, wenn man es parallel startet und das aufrufende Script danach weiterläuft. Synchron ist in dem Fall "sequenziell" - sprich das aufrufende Script waretet, bis das zweite fertig ist. Und das geht ja bei "endlos-Scripts" nicht, da das System sonst steht ;)

Eine Frage habe ich noch.... wie lasse ich im Komandomenü von Stationen anzeigen, dass das Script läuft.... das Handelsverbot des HVT und des Universumshändlers von Lucike macht sowas....

Gruß
Reflexer
eine local var geht auch. wenn du ein array in der local verwendets bietet sich der arrayplatz 0 (1) an da dieser meist nur an (1) oder aus (null) beinhaltet. kann aber genauso genutzt werden

die local bietet sich direkt an da das script auf [THIS] vermutlich geschrieben wurde (da kommando) allerdings muss man dann jedes komplexzentrum (beim uninstall) bzw das komplexzentrum auf die local prüfen und kann nicht einfach nur die globalvar verändern.

zudem laufen die meisten Scripts mit [THIS] was dann die Entsprechende station ist. also vor und Nachteile

edit: meine güte seit ihr alle schnell:

nein das script wird direkt auf dem entsprechenden task gestartet. ist der task belegt wird der task mit neuem script überschrieben und das alte wird dann an irgendeiner stelle unterbrochen **falls das script eine höhere oder gleiche prio hat**
User avatar
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER »

Oder irre ich mich?
Ja, du irrst dich. ;)

Da ich inzwischen verstanden habe was du mit "asynchron" meinst (nämlich parallel), kannst du dir merken, dass alle Skriptaufrufe die mit "start" beginnen (also auch START <RejObj> script <Script Name>:) das aufrufende Skript parallel ausführen.
Du musst aber acht geben, dass du das aufrufende Skript nicht auch dem gleichen Task wie das aktuelle Skript startest, denn dadurch würde das aufrufende Skript ja überschrieben werden, obwohl es ja eigentlich weiterlaufen sollte. Das führt dann zu Problemen, wie ich hier am eigenen Leib erfahren habe. ;)
**falls das script eine höhere oder gleiche prio hat**
Nein, das gilt nur für "interrupts". Beim Starten von Skripts auf bestimmten Tasks wird der komplette Stack gelöscht und nur noch das aufgerufene Skript läuft.

EDIT:
Wenn ich das Script nun beenden möchte, muss ich es ja von "außen" beenden. Ich werde nun vermutlich eine gV nehmen
Also ich würde es mit der von Lucike genannten Methode machen. Das ist einfach sauberer, da das Skript direkt beendet wird und du keine zusätzlichen Variablen brauchst.

MfG,
ScRaT
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

du kennst ja das Zeichen für den auskommentierten Bereich in den Scripten. wollt nur was wissen :) jetzt hab ich erfahren was ich wollte ;)

Gruß Generalwest
User avatar
SuperVegeta
Posts: 1611
Joined: Tue, 20. Dec 05, 11:13
x3tc

Post by SuperVegeta »

ney, ney, ney

Leute machts euch doch nich schwerer als es sein muß :!:

Wenn du das Script mit einem Kommando auf einem Komplex starten
willst, wieso dann so umständlich mit task und von außen mit GVs und sonst was wieder killen.
Mach doch einfach ein ganz normales Stationskommando draus und fertig.
Das ist genauso eine Schleife, die Taktungszeit kann man ja beliebig einstellen, man kann es per Kommandomenü manuell deaktivieren,
man sieht sofort welche Station es ausführt und welche nicht,
un der Task ist zumindest eingeschrenkt 10-19 und schnell auslesbar um es
auch von außen quiten zu können.
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

Es ist schön endlich mal einen Durchblick in dem Script-Aufruf-Wirrwar zu bekommen :)

Ich glaube ich fasse die ganzen Erkenntnisse mal in einem "How-To" zusammen.... :lol:

Danke euch allen :) Dann steht dem Script ja nicht mehr viel im Weg.
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

SuperVegeta wrote:Mach doch einfach ein ganz normales Stationskommando draus und fertig.
Das ist genauso eine Schleife, die Taktungszeit kann man ja beliebig einstellen, man kann es per Kommandomenü manuell deaktivieren,
man sieht sofort welche Station es ausführt und welche nicht,
un der Task ist zumindest eingeschrenkt 10-19 und schnell auslesbar um es
auch von außen quiten zu können.
wenn Du mir jetzt noch sagst, wie ich das mache, dann mache ich das ;)

Darauf zielte meine Teilfrage vorhin ab.... Wie mache ich im Stations-Komandomenü sichtbar, dass es läuft? Und wie mache ich es in der Form abschaltbar...

Aktuell macht mein Setup folgendes:

Code: Select all

$tmpCmd = {COMMAND_TYPE_STATION_55} 
global script map: set: key=$tmpCmd, class={Komplexzentrum}, race={Spieler}, script='plugin.ccdmanager.station.preload', prio=0
set script command upgrade: command=$tmpCmd  upgrade=[TRUE]
Und das Preload ermittelt dann die entsprechende TaskID und startet das endlos-Script:

Code: Select all

[THIS]->start task $anTaskID with script 'plugin.ccdmanager.station.check' and prio 0: arg1=null arg2=null arg3=null arg4=null arg5=null
Was müsste ich ändern, damit es als "normales" Stationskommando läuft und es auch angezeigt wird, dass es aktiv ist?
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

wenn das noch so wie in r geht durch command name unter Version und descrition. Nagel mich aber nicht fest da ich das nur einmal gemacht hab in x3R. (nimm dazu das Main Script und nicht das Setup) einfach mal ausprobiern.

Edit: Also wählst du im Comand Name Menü dein Stationskom aus und testest es.
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

So funktioniert das irgendwie nicht.

Im Stationskommando sind ja die "Slot 1:" bis "Slot 10:" Einträge.

Irgendwie muss man da ja das laufende Skript sichtbar machen können. Hat es was damit zu tun, auf welchem Task das Script läuft?
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

wart ma kurz ich such in meiner engien mal schnell was relevantes

so habs getestet und das script erscheint mit unknow kommand, da ich kein stationsmenü eintrag getippt habe.

Also du öffnest das script das mit while true läuft und gehst dann im oberen bereich in das dritte menü (unter description) und änderst im nächsten menü eintrag ignorierst die ersten beiden einträge wie <string> und mane und besteätigst <signal command/ command> und wählst deinen kommandoeintrag aus ich mach grad noch n paar pics

jetzt noch n bildhoster finden und ich stell die zwei pics rein mom

pic eins:
[ external image ]

Bild 2
[ external image ]

Bild 1: Da wo Command Name: ist da dann den unterpunkt <command/signal> dein Stationskommando und schon gibt das script Bild 2 im Stationsmenü wieder.

Also nicht null oder <string> auswählen ka wird schon für was gut sein hab ich aber nie gebraucht. geht nur bei endlos scripten. das script läuft dann je nachdem (Task 10 = Kommandoslot 1 also so wie im Bild - Task 19)
Last edited by Generalwest on Fri, 18. Jun 10, 23:56, edited 1 time in total.
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

das wäre supi :)
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

ich hoff das die pics nicht zu groß sind ... ich hof du kannst mit der Bild zu Bild Anleitung was anfangen ^^

Notiz an mich: Geht noch so wie in R

Return to “X³: Terran Conflict / Albion Prelude - Scripts und Modding”