auf Event aus anderem Skript reagieren

  • Also, folgendes Problem.

    Ich habe ein Hauptprogramm, mit dem ich die Daten und Wartungen unserer Autos und Motorräder verwalten kann.
    Jetzt möchte ich das Erfassen neuer Fahrzeuge über ein 2. Skript machen, das aus dem ersten nach betätigen eines Controls über run gestartet wird.
    Während die GUI des 2. Skriptes geöffnet ist, das Fahrzeug also eingegeben wird, soll in der 1. GUI, also dem Hauptprogramm ganz normal weiter gearbeitet werden können. Erst wenn die Daten des neuen Fahrzeugs gespeichert wurden, soll das Hauptprogramm die im Speicher befindlichen Daten aktualisieren. Ich suche also eine Möglichkeit, aus dem 2. Skript ein Event aus zu lösen, auf das das 1. Skript aus dem laufen heraus ähnlich dem GUIonEvent-Mode reagiert.
    Im weiteren Programmablauf sollen auf ähnliche Weise auch durchgeführte Reparaturen, Wartungen oder passende Ersatzteile erfasst werden.
    runwait geht ja nicht, weil das 1. Skript dann so lange nicht mehr arbeitet.

    Ich hoffe mal, ihr könnt mich helfen und ich habe nicht wieder was total offensichtliches übersehen.

  • Naja. Du kannst doch ohne Probleme mehrere Fenster in einem Script haben. Du darfst halt nur eine While-Schleife haben.
    Falls du unbedingt mehrere Scripte nutzen willst (was eigentlich nur sinnvoll ist, wenn das andere Programm nebenbei etwas machen soll, außer auf eingaben zu warten), dann Würde ich dir TCP empfehlen. Dann kannst du das Programm starten, das verbindet sich am Schluss mit dem anderen Script und überträgt die Daten. Ist aber eigentlich bei dem was du vorhst nicht notwendig.

    Beispiel:

  • Irgendwie war mir klar, dass der Hinweis kommt, das alles in einem Script ab zu handeln :D Hatte noch überlegt, dazu was rein zu schreiben.

    Das Script ist jetzt schon total unübersichtlich, dass die gui mit variabler Größe auch macht, was sie soll. Das 1. Skript soll ja nicht primär nur auf Eingaben warten. Es geht darum, wenn beim Eingeben neuer Sachen etwas nachgeschaut werden muss, oder mehrere Fahrzeuge parallel behandelt werden sollen. Das will ich nicht alles in einem Skript abhandeln.
    Es müssen ja keine Daten übertragen werden. Es reicht dann eigentlich schon, wenn ich dem 1. Skript signalisieren kann, dass es die Daten für die Fahrzeuge neu laden soll, dass diese direkt nach Bestätigung der Eingabe zur Verfügung stehen.

  • wie wäre es wenn du etwas mehr Angaben machst:

    • wie, wo werden die Daten gespeichert (txt, ini, excel, SQLite)
    • sollen Daten von mehreren Arbeitsplätzen aus erfasst werden

    am besten zeigst du uns einmal was du bisher hast.

  • Hi autoBert,

    die Daten liegen in einer Ini vor, deren Name der FIN entspricht. in der 1. Sektion stehen die Fahrzeugdaten, in der 2. Informationen zu den Wartungsintervallen und ab der 3. werden Informationen zu den durchgeführten Wartungen erfasst.
    Das Programm soll vorerst nur auf einem PC laufen. Falls ich mal mit meinem Werkstatt-PC weiter komme, könnte es sein, dass dieser auf dieselben Daten zugreifen soll, was im Moment aber noch in weiter Zukunft liegt.

    Den bisherigen Code möchte ich nur ungern posten, sollte hierfür aber auch nicht essentiell sein. Mich interessiert, ob und wie es allgemein machbar wäre, einen Interrupt in einem anderen laufenden Skript auszulösen.

    @all:
    Bitte nicht falsch verstehen. Ich bin sehr dankbar für alle produktiven Antworten und finde es auch super, dass man hier mit ziemlich allen Fragen immer ein offenes Ohr findet. Bei meiner Frage suche ich diesmal aber wirklich nach einer Lösung, die dem oben beschriebenen Problem mit 2 Skripten entspricht und keine Möglichkeit, diese Situation irgendwie zu umgehen.

  • - Lass die erfassten Daten aus der 2. GUI in eine Datei schreiben. Eine INI sollte das gut lösen können, falls auch mehr als nur 1 "Datensatz" anfällt.
    - Bau im 1. Script einen zusätzlichen Button ein. Mit dem liest du dann die Datensätze aus und überträgst sie dahin, wo sie hin sollen. Wenn das erledigt ist,
    lässt du diese Zwischenspeicherdatei wieder löschen.
    - Alternativ kannst du auch den Button weglassen und das automatisiert prüfen lassen ob eine Zwischenspeicherdatei existiert und wenn ja, dann einlesen.

  • Hmm. die Daten werden ja so oder so in eine ini geschrieben, nur ist bei Programmstart ja der Name noch nicht bekannt. Ein Aktualisierungsbutton wäre eine Lösung, aber automatisch wäre mir lieber.
    Du meinst quasi, ich soll eine temporäre Datei anlegen lassen, die dem 1. Programm signalisiert, dass das 2. fertig ist. Bremst das nicht aus, wenn das Programm in einer Schleife immer wieder auf die Platte zugreifen muss um auf die Existenz der Datei zu prüfen?
    Ich hatte mir auch schon überlegt, die Prozess-IDs der gestarteten Programme in einem Array zu speichern und in einer Schleife immer wieder zu prüfen ob diese noch existieren. Bei beidem müsste aber eben in einer Schleife geprüft werden. Ich hatte gehofft etwas zu finden, das wie GUIRegisterMsg das Programm unterbricht und die Aktualisierungsfunktion startet.

  • Ich hatte gehofft etwas zu finden, das wie GUIRegisterMsg das Programm unterbricht und die Aktualisierungsfunktion startet.

    Ich dachte, das ist genau das, was du nicht willst?
    Wenn es dir egal ist, dass das Hauptprogramm unterbrochen wird, dann kannst du das definitiv alles in 1 Script packen.

    Bremst das nicht aus, wenn das Programm in einer Schleife immer wieder auf die Platte zugreifen muss um auf die Existenz der Datei zu prüfen?

    Das glaube ich nicht, weiss es aber auch nicht 100%ig. Ich sehe da jedenfalls kein Problem. Ist ja nicht so, dass pro If FileExists("blabla") Then
    1000 Zugriffe pro Sekunde auf die Platte erfolgen. Allerdings kommt es natürlich auch immer auf den PC an. Wenn das eine C64-ähnliche "Gurke" ist,
    könnte es dann vermutlich doch bremsen :D

    Aus meiner Sicht ist das der einfachste Weg so etwas umzusetzen, aber sicherlich nicht der eleganteste/schnellste/beste.
    Wenn du allerdings schon fortgeschrittener im Umgang mit AutoIt bist, dann ist die Lösung von @Andy aus dem geposteten Link von @Homer J. S. die
    idealere Lösung für dich. Warum fortgeschrittener? Weil man verstehen sollte, was der Code macht, den man verwendet.

    MfG Lo..

  • So, hat leider etwas gedauert, weil ich viel anderes zu tun hatte.

    Lottich: Das Programm soll für die Aktualisierung nach dem Erfassen neuer Daten unterbrochen werden, aber solange die Erfassung durchgeführt wird (sprich die GUI zur Eingabe neuer Daten angezeigt wird) noch normal weiterlaufen, so dass man auch zwischendurch noch was bei z.B. anderen Fahrzeugen nachschauen kann.

    Um ein Event zu starten habe ich mir gedacht, ich erstelle eine unsichtbare GUI mit einem Edit im guiOnEvent-Mode und übergebe das Handle per Parameter an das neu gestartete Skript, das seine Rückmeldungen in das Edit schreibt (sofern sich das Event davon auslösen lässt).

    Ansonsten kann ich eine einfache Existenzabfrage ja über die ID aus ShellExecute realisieren. Als letzte Möglichkeit scheint mir die Exchange Variables UDF von Eukalyptus recht praktisch zu sein.

    Ich denke mal, damit lässt sich das Problem recht gut lösen, auch wenn die letzten beiden Wege ja lein Event auslosen, sondern in einer Schleife geprüft werden müssen.

    Leider konnte ich noch keine Tests machen, aber ich bin recht zuversichtlich und setze das Thema deswegen auch auf gelöst.

    Danke für eure Hilfe.

  • Könnte man nicht auch einen unsichtbaren/nicht erreichbaren Button anlegen, der dann vom anderen Skript betätigt wird? Zusätzlich wäre ein Input oä. möglich um Strings zu übermitteln...

    LG
    Christoph :)

  • @Mistl: Lies dir in Ruhe den von mir gepostet Beitrag durch und mache es mir der Lösung von Andy. Das ist meiner Meinung nach die beste und sicherste Lösung!

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

    Einmal editiert, zuletzt von Homer J. S. (25. Juli 2016 um 23:01)

  • Das habe ich, aber um da durch zu steigen, muss ich mich wohl erst noch etwas mehr mit autoit beschäftigen. Ich verstehe von dem geschriebenen nämlich nicht wirklich viel ^^

    @Christoph: das ist doch fast das, was ich mit dem unsichtbaren Edit gemeint habe, nur dass ich es ohne einen Zusätzlichen Button versuche.

  • Es gibt eine sehr simple Lösung, welche ich bei Assembleit2_64 eingesetzt hatte, um 32-Bit-Programme mit 64-Bit-Programmen kommunizieren zu lassen.

    Das Programm A erstellt ein (unsichtbares) Edit- oder Labelcontrol und schreibt dort seine Daten rein.
    Programm B holt sich über das Fensterhandle und ControlGetText den Inhalt dieses Controls.

    Für ein einfaches, d.h. zeitunkritisches Script reicht es, wenn Programm B sich per AdlibRegister bspw. alle 10/100/1000 Millisekunden den Inhalt des Controls von Programm A ausliest. Sobald der Inhalt ausgelesen ist, schreibt Programm B einen Leerstring in das Control. Heißt also, solange das Control "leer" ist, gibt es auch keine neuen Daten.
    Wenn Programm A neue Daten zur Verfügung hat, werden diese ins Control geschrieben.

    Benötigt in beiden Programmen nur eine Handvoll Zeilen.