If not Fileexists Then

  • hey, ich habe ein komisches problem mit dem FileExists befehl.
    wenn ich mehrere autoit programme gleichzeitig laufen lasse, habe ich eine funktion eingebaut, sobald ein programm anfangen möchte zu arbeiten, geht es in eine whileschleife und wartet solange, bis eine .txt datei nichtmehr vorhanden ist. diese .txt datei wird von allen programmen in demselben ordner erstellt wenn es anfängt zu arbeiten und wieder gelöscht, wenn die arbeit fertig ist und es sich wieder im "leerlauf" befindet.

    die funktion ist sehr simple aufgebaut


    ist an dieser funktion etwas falsch ?

    ich habe folgendes problem:
    wenn programm A anfängt zu "arbeiten", erstellt es eine datei in $DirArbeitet. (ich sehe die datei mit eigenen augen in dem ordner).
    dann gebe ich programm B den befehl auch zu "arbeiten"... dieses sollte jetzt eigentlich in der whileschleife solange warten, bis die datei von progrmam A wieder gelöscht wurde. allerdings wird dies komplett ignoiert und programm B fängt einfach an zu arbeiten...

    warum ist das so ?
    *manchmal funktioniert es.. ?(


    wie löst ihr dieses problem ? gibt es andere funktionen ?

    mfg

  • Hi,

    Klappt bei mir problemlos, selbst wenn ich 2 Instanzen in sehr kurzem Interwall(ca. 50ms) Starte.
    Stell am besten mal ein funktionierendes Script zur verfügung, welches diesen Fehler aufweist.

    Edit: Wenn es mehr als zwei Instanzen sind, werden nachdem die erste fertig ist logischerweise alle verbeibenen gleichzeitig ausgeführt, das ist vermutlich dein Problem oder?

    Edit2: Versuch es mal so:

    AutoIt
    Local $sStartTime = @MIN & ":" & @SEC & ":" & @MSEC
    If Not @Compiled Then
       MsgBox(16,"", "Programm funktioniert nicht als Script!")
       exit
    EndIf
    Do
       sleep(50)
    Until ProcessList(@ScriptName)[1][1] == @AutoItPID; Eine Fehlerabfrage ist nicht wirklich notwendig, sollte aber vll trozdem eingebaut werden.
    MsgBox(0,"","Startzeit des Prozesses: "& $sStartTime)


    Edit3:
    Sorry hatte die Frage etwas falsch verstanden, das Script aus Edit2 war passt nicht ganz.

    Hier noch ein Paar Ideen:

    1) Eine mögliche Lösung wäre für dich warscheinlich das über ein "drittes" Programm zu regeln, bei welchem die anderen Prozesse dann(z.B. per TCP) die Start Erlaubniss anfragen/erhalten können.
    2 )Die Programme könnten auch alle Seperate Dateien erstellen sobald sie anfangen zu Warten, wenn dann die Prozess Id als Dateiname benützt wird könnte man z.B. sagen dass erst angefangen werden darf, wenn keine Datei mit einer niedrigeren Id(Dateiname) mehr da ist.
    3) Pack alles in ein Programm, nach deiner Beschreibug erscheint mir das als naheliegendste Lösung.

    mfg,

    Zeitriss

    2 Mal editiert, zuletzt von Zeitriss (29. Juli 2016 um 17:44)

  • die funktion ist sehr simple aufgebaut

    stimmt die beiden Funktionen:

    sind sehr simpel. Der Fehler liegt also woanders. Ohne ein lauffähiges Skript, daß diesen Fehler produziert kann man nur die :Glaskugel: befragen. Meine sagt vielleicht solltest du SIngleTon benutzen um nur eine Instanz zu zu lassen.

  • Hier nochmal ein bisschen Balstelwerk mit TCP, hierbei verwaltet ein Server die Reihenfolge.
    Solltest aber, falls du es nützen möchtest, den Code nicht einfach übernehmen, er ist noch ziemlich verbesserungsbedürftig z.B. ist ein Array vielleicht nicht unbedingt die Optimale Wahl.

    mfg,

    Zeitriss

  • @autoBert
    hmm.. das ganze script ist etwas lang um es hier zu posten. der fehler passiert aber genau in diesen funktionen.
    das script arbeitet alle schritte ab, kommt dann an die function "Arbeitet", bei der das script solange warten soll, bis die .txt datei nichtmehr vorhanden ist (also von anderm programm gelöscht wurde) und da ignoriert es einfach den befehl "If Not FileExists", auch wenn das file existiert, geht das script in die function. merkwürdig ist, dass das nicht immer passiert, manchmal wartet es auch(so wie es eignetlich sein soll).
    auch wenn ich die datei vor 5 sec von einem anderen script erstellt wurde und ich diese schon sehen kann und lesen kann, überspringt es den befehl...

    @Zeitriss
    vielen dank für deine mühe :)
    bis jetzt kenne ich mich mit dem ganzen TCP zeug nicht aus, ich werde es mir aber mal genauer anschauen, sieht interessant aus :)


    kann man das ganze vielleicht auch so machen, dass die .txt immer existiert und wenn ein programm anfängt zu "arbeiten", dann wird eine 1 reingeschrieben und wenn es fertig ist, löscht es den kompletten text, sodass andere programme wissen, dass losgelegt werden kann ?
    wenn ja, wie heißt die function um eine .txt zu leeren aber nicht löschen und neu zu erstellen ?

    würde es so funktionieren ?(theoretisch) (habe es nicht getestet)

    2 Mal editiert, zuletzt von Lanealine (1. August 2016 um 05:10)

  • hmm.. das ganze script ist etwas lang um es hier zu posten. der fehler passiert aber genau in diesen funktionen.

    ich sagte ja nicht du sollst dein Originalscript posten. Wenn du ea aber nicht schaffst ein Skript bereitszustellen, daß den Fehler produziert, wie soll dir dann jemand helfen? Denn eines bin ich mir sicher FileExists arbeitet richtig. Muß der Fehler also woanders liegen, ich tippe auf Logik.

    Übbrigens meist findet man bei dem Versuch ein (möglichst kleines, lauffähiges) Skript zu schreiben, welches den Fehler produziert, selbst den Fehler.

    Du könntest natürlich auch Singleton dazu verwenden. Einfach beide Skripte mit dem gleichen "einmaligen Namen" = $sOccurenceName testen. Dann funktionieren beide Skripte nach dem:

    Es kann nur einen geben.

  • Probier mal If FileExits($DirArbeitet) = 0
    Hatte in einem meiner Scripte das Selbe Problem. Seitdem ich auf "Not" verzichte läuft es einwandfrei.

  • mehrere autoit programme gleichzeitig laufen lasse

    Wie viele sind mehrere?

    Du hast kein Sleep in deiner "Warteschleife", daher überprüfen deine Programme sehr oft ob die Datei exestiert.
    Wenn nun mehrere Programme in der Schleife warten wärend das aktive die Datei löscht überprüfen die wartenen Programme die Datei fast gleichzeitig.
    Alle Programme die zuvor gewartet haben denken nun gleichzeitig, dass sie an der Reihe sind. Die Datei wird viel zu spät erzeugt.

    Wenn ich richtig liege sollte dann folgendes die Fehlerwarscheinlichkeit drastisch reduzieren:

    Dies ist natürlich keine Lösung für das Problem, ich hatte zuvor schon Möglichkeiten beschrieben wie sich das Problem warscheinlich lösen lässt, ich möchte nur sichergehen dass ich den Fehler richtig verstanden habe.

    mfg,

    Zeitriss

    Einmal editiert, zuletzt von Zeitriss (1. August 2016 um 19:57) aus folgendem Grund: Script funktionierte nicht, wenn die Funktion Arbeitet() in zu kurzem Intervall aufgerufen wurde

    • Offizieller Beitrag

    Das ist wieder eine typische X-Y-Situation.
    Es werden Vorschläge und "Lösungen" zu "X" gepostet, obwohl das eigentliche Problem "Y" nicht bekannt ist.
    Die "Lösung" muss zwangsläufig zu Fehlern führen, weil evtl. mehrere Programme "gleichzeitig" die Datei erstellen und das Script ohne Überprüfung sofort die Schleife verlässt.
    Um aber eine vernünftige Lösung zu präsentieren, ist es notwendig das eigentliche Problem zu kennen: "Warum dürfen nicht mehrere Instanzen gleichzeitig arbeiten?"