c++ prüfung ob schreibvorgang von anderem Programm beendet



  • Hallo,

    ich habe folgende Situation. Ich möchte aus einer Datei einen Zahlenwert mittels Stream auslesen. Die Datei wird von einem anderen Programm erzeugt und dann der Wert hineingeschrieben.

    Das auslesen an sich ist ja kein Problem. Nur nicht vor dem abgeschlossenen Schreibvorgang zu lesen ist problematisch. Ich habe bis jetzt nur folgende Möglichkeit ausprobiert: Mit While-Schleife prüfen ob Datei existiert, dann warte 2 Sekunden und lese dann ein.

    Das ist natürlich von der Laufzeit schlecht.
    Eine zweite Möglichkeit wäre ein Flag nach der Zahl zu setzen und dann solange die datei zu lesen bis das flag auftaucht.

    Was kann man da noch machen? Kann man vielleicht sicherstellen, dass ich exklusiv die Datei lese und der Schreibprozess beendet isT?

    Grüße
    Guddy


  • Administrator

    Die einfachste Möglichkeit, welche ich hier sehe, ist, dass du über den localhost (127.0.0.1) und Sockets die beiden Programme kommunizieren lässt. Dann kann das erste Programm, welche die Datei erzeugt, sobald es fertig ist, dem anderen eine Nachricht schicken, dass die Datei jetzt vorhanden ist.

    Dazu könnte man zum Beispiel Boost.Asio benutzen.

    Grüssli



  • Du könntest als 'Flag' eine zweite Datei benutzen. Programm 1 schreibt also die Datei, die von Programm 2 gelesen werden soll.
    Danach schreibt es eine weitere Datei auf die Platte.
    Programm 2 prüft auf die Existenz der zweiten Datei, wenn diese gefunden wird, ist klar, daß die eigentliche Datei, aus der gelesen werden soll, fertig ist.
    Programm 2 liest also nun seine Daten und löscht die als 'Flag' dienende Datei für den nächsten Programmlauf.



  • Danke für eure Tipps. Ich werd mir das mal anschauen. Leider hab ich keinen Zugriff auf den schreibenden Rechner. Da fällt wahrscheinlich die Variante mit boost schon weg.
    Ich hab jetzt in die zu lesende Datei ein Flag geschrieben und lese solange aus bis das Flag gelesen wurde. Funktioniert wunderbar.

    Viele Grüße

    Guddy



  • Shared Memory wäre auch eine sauberere Methode der Prozesskommunikation. Falls du mehr in der Richtung machen willst sicher eine Überlegung wert.

    Ansonsten als ersten Wert in die Datei eine Checksumme und die Größe der zu erwartenden Daten schreiben. Dann kannst du immer sehen ob alles okay ist. Eventuell auch noch eine ID dazu, damit du siehst, ob es eine neue Nachricht ist.




Anmelden zum Antworten