Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 30.05.2017, 20:00 Titel: Warten bis Datei da ist und nicht hinein geschrieben wird? |
|
|
Folgendes Problem:
Ein Programm erstellt eine (Text)-Datei und schreibt was rein. Ein anderes Programm soll dann die Werte einlesen! So weit, so gut.
Doch:
Wenn jetzt Programm 2 zu früh mit dem einlesen beginnt, fehlen Werte oder es wird nichts eingelesen! Gibt es eine Möglichkeit, mit dem Ausführen des Programmes 2 so lange zu warten bis Programm 1 nicht mehr in die erstellte Datei schreibt? Also Programm 2 soll so lange warten, bis Programm 1 fertig ist. Ich brauche irgendwie eine Überprüfung, ob noch in die Textdatei geschrieben wird! Ich habe das zwar irgendwie lösen können, nur gibt es da ein störendes Fenster. Das muss in jedem Fall weg! Keine Ahnung, ob das irgendwie machbar ist?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 30.05.2017, 21:03 Titel: |
|
|
Vielleicht Dich einmal mit sog. Named Pipes vertraut machen. Generell auch das Thema IPC studieren.
Primitivlösung: Datei nach dem Schreiben umbenennen, also zuerst noch CLOSE, dann NAME .. AS aufrufen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 30.05.2017, 21:13 Titel: |
|
|
Hallo ALWIM!
Ich habe das Problem seinerzeit so gelöst, daß das lesende Programm vor und nach dem Lesevorgang mit Lof die Länge der Datei überprüft. Sind die Werte unterschiedlich, wurde zwischenzeitlich in die Datei geschrieben, und der Lesevorgang wird wiederholt.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 31.05.2017, 01:30 Titel: |
|
|
dreael hat Folgendes geschrieben: | Vielleicht Dich einmal mit sog. Named Pipes vertraut machen. Generell auch das Thema IPC studieren.
Primitivlösung: Datei nach dem Schreiben umbenennen, also zuerst noch CLOSE, dann NAME .. AS aufrufen. |
Die Primitivlösung funktioniert bei mir nicht, da ich keinen Einfluss auf das Programm samt Ausgabedatei habe! Das macht ja die Sache umso schwieriger! Wäre es mein eigenes geschriebenes Programm, hätte ich eine funktionierende Lösung:
Programm 1 erstellt eine Sperrdatei; Sperrdatei wird nach dem Schreibvorgang gelöscht; Programm 2 wartet bis die Datei gelöscht wurde und ruft dann Textdatei zum einlesen auf. Die Länge der Datei überprüfen, funktioniert auch nicht, da diese unterschiedlich lang sein kann bzw. ich die genaue länge nicht kenne! Was, wenn Programm 1 keine "Sperre" macht? Ich habe momentan was funktionsfähiges, aber mich stört nur das Fenster das ich dabei habe, während gewartet wird:
Genau dieses Fenster will ich (sofern möglich), weg haben.
Nach Aufruf der Batch-Datei, wird ein externes Programm gestartet, was eine Textdatei erstellt.
Edit:
Das mit dem prüfen der Länge könnte vielleicht doch klappen? Länge der Datei ermitteln; Länge der Datei erneut abfragen; Sind die Werte unterschiedlich, so lange abfragen bis Werte gleich sind??? Theoretisch kann es passieren, dass Datei vorher eingelesen wurde, bevor Programm 1 mit dem schreiben fertig war (P1 brauchte zu lange mit dem schreiben)?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 31.05.2017, 22:05 Titel: |
|
|
Es gibt noch einen Trick um festzustellen, ob ein anderes Programm gerade auf eine Datei zugreift: Man testet, ob sich die Datei umbenennen lässt, wobei der alte und der neue Name gleich sind. Greift ein anderes Programm auf die Datei zu, wird die Umbenennung verweigert. Ist die Umbenennung erfolgreich, ändert sich nichts, da der neue Name derselbe ist wie der alte.
Code: | 'Hält eine Datei geöffnet
Dim As String datei = ExePath + "\test.txt"
Open datei For Output As #1
Sleep
Close |
Code: | 'Prüft, ob ein anderes Programm auf die Datei zugreift
Dim As String datei = ExePath + "\test.txt"
? Name (datei, datei)
Sleep |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 01.06.2017, 08:06 Titel: |
|
|
Würde es nicht auch funktionieren über die Dateiattribute das letzte Änderungsdatum einzulesen? (FILEDATETIME) Wenn sich das Änderungsdatum erneuert, muss die Datei neu eingelesen werden. Allerdings habe ich keine Ahnung, wie zuverlässig Windows dieses Attribut pflegt (ich erinnere mich da noch unter XP an die Fantasiewerte bei der Anzeige, wie häufig ein Programm genutzt worden sein soll ...) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 01.06.2017, 10:35 Titel: |
|
|
nemored hat Folgendes geschrieben: | Würde es nicht auch funktionieren über die Dateiattribute das letzte Änderungsdatum einzulesen? | Leider nicht. Das Bearbeitungsdatum wird erst aktualisiert, wenn das schreibende Programm die Datei schliesst. Dasselbe gilt übrigens auch für FileLen. Die beschriebene Längenprüfung "on the fly" funktioniert nur mit Lof.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 01.06.2017, 12:11 Titel: |
|
|
Statt umbenennen könnte man auch probieren die Datei mit exklusiven Zugriffsrechten zu öffnen - das wird fehlschlagen solange ein anderes Programm die Datei geöffnet hat. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 01.06.2017, 18:13 Titel: |
|
|
Theoretisch gibt es in FreeBASIC die Möglichkeit, die Datei beim Öffnen zu locken, aber ich glaube, dass das nicht so richtig funktioniert. Da müsste dann eine andere Bibliothek oder die API ran.
grindstone hat Folgendes geschrieben: | nemored hat Folgendes geschrieben: | Würde es nicht auch funktionieren über die Dateiattribute das letzte Änderungsdatum einzulesen? | Leider nicht. Das Bearbeitungsdatum wird erst aktualisiert, wenn das schreibende Programm die Datei schliesst. |
Soweit ist mir das schon klar, aber das lesende Programm muss ja nur aktiv werden, wenn sich die Daten geändert haben, also wenn die Datenänderung abgeschlossen ist. Idealerweise würde wohl das lesende Programm immer schon im Hintergrund laufen, bevor das schreibende aktiv wird. Nur so eine Idee. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 01.06.2017, 23:19 Titel: |
|
|
St_W hat Folgendes geschrieben: | Statt umbenennen könnte man auch probieren die Datei mit exklusiven Zugriffsrechten zu öffnen | Das funktioniert -zumindest mit FB - Bordmitteln- nicht. Eine mit Lock gesperrte Datei lässt sich trotzdem von einem anderen Prozess öffnen - auch zum Schreiben (habe ich gerade ausprobiert). Damit ist das Chaos (Achtung, Wortspiel! ) vorprogrammiert.
@nemored: Ich weiß ja nicht, was ALWIM genau vorhat, aber es stimmt: Zur Detektion eines abgeschlossenen Schreibvorgangs wäre die Überwachung des Änderungszeitpunkts die ideale Lösung.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 03.06.2017, 03:51 Titel: |
|
|
grindstone hat Folgendes geschrieben: | St_W hat Folgendes geschrieben: | Statt umbenennen könnte man auch probieren die Datei mit exklusiven Zugriffsrechten zu öffnen | Das funktioniert -zumindest mit FB - Bordmitteln- nicht. Eine mit Lock gesperrte Datei lässt sich trotzdem von einem anderen Prozess öffnen - auch zum Schreiben (habe ich gerade ausprobiert). Damit ist das Chaos (Achtung, Wortspiel! ) vorprogrammiert.
@nemored: Ich weiß ja nicht, was ALWIM genau vorhat, aber es stimmt: Zur Detektion eines abgeschlossenen Schreibvorgangs wäre die Überwachung des Änderungszeitpunkts die ideale Lösung.
Gruß
grindstone |
Was ich vor habe? Also: Ich öffne in meinem Programm mit Shell eine Batchdatei. Die Batchdatei öffnet ein anderes externes Programm, was Daten einliest und dann eine Textdatei erstellt und diese mit Daten füllt. Durch den Aufruf von Shell gibt es ein (störendes) Fenster! Dieses will ich weg haben. Auf das externe Programm, habe ich keinen Einfluss!
Durch die vielen Antworten, weiß ich jetzt echt nicht, was nun funktioniert und was nicht?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 03.06.2017, 20:07 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | Was ich vor habe? Also: Ich öffne in meinem Programm mit Shell eine Batchdatei. Die Batchdatei öffnet ein anderes externes Programm, was Daten einliest und dann eine Textdatei erstellt und diese mit Daten füllt. Durch den Aufruf von Shell gibt es ein (störendes) Fenster! Dieses will ich weg haben. Auf das externe Programm, habe ich keinen Einfluss! |
Danke fürs Einschenken von klarem Wein! :-)
Also: In diesem Fall sieht die Sache schon ganz anders aus. Ich gehe einmal von der Annahme aus, dass das aufzurufende Programm ohne Quellcode Dir vorliegt (nur .EXE) und ferner eine Konsolenapplikation ist.
Falls die von Dir genannte Batchdatei lediglich den Zweck hat, mit ">" die Ausgabe umzuleiten, dann wäre Dein Freund und Helfer OPEN PIPE, denn dieses liefert Dir exakt den Output weiter.
Ansonsten für den Fall, wenn Du bei Deiner Batchdatei bleiben möchtest oder musst, dann musst Du das Programm mit START /WAIT aufrufen. Damit wartet solange das FreeBasic auf das Programmende und somit auf den fertigen Output und Du kannst Dir all die komplizierten Basteleien mit LOCKs, Änderungsdatum, Längencheck usw. ersparen, dann kannst Du einfach ganz normal mit OPEN .. FOR INPUT AS zum Lesen öffnen, weil ja dank dem START /WAIT das externe Programm garantiert fertig ist. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 03.06.2017, 22:55 Titel: |
|
|
Richtig, mir liegt bei dem anderen Programm kein Quellcode vor! Wie genau das mit Wait bzw. Start funktioniert, muss ich noch genauer anschauen? Bei der Batch Datei muss ich bleiben. Die Batch Datei ruft das externe Programm mit Parametern auf!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 04.06.2017, 00:33 Titel: |
|
|
Du kannst auch aus einem FreeBASIC-Programm aus ein externes Programm mit Parametern aufrufen (siehe z. B. SHELL). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 04.06.2017, 01:06 Titel: |
|
|
nemored hat Folgendes geschrieben: | Du kannst auch aus einem FreeBASIC-Programm aus ein externes Programm mit Parametern aufrufen (siehe z. B. SHELL). |
Das weiß ich! Nur funktioniert das ganze eben nicht. Deswegen, habe ich da die Lösung mit der Batch-Datei. Sind einfach zu viele Parameter! Inhalt der Batchdatei:
Code: | "C:\Program Files (x86)\Java\jre1.8.0_121\bin\javaw.exe" -ea -jar "G:\javafo.jar" "G:\javafo_in.txt" -p > "G:\javafo_out.txt" -w |
_________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 04.06.2017, 02:50 Titel: |
|
|
Der entsprechende Shellbefehl lautet: Code: | Shell "start ""C:\Program Files (x86)\Java\jre1.8.0_121\bin\"" javaw.exe -ea -jar ""G:\javafo.jar"" ""G:\javafo_in.txt"" -p > ""G:\javafo_out.txt"" -w" |
Das Setzen der Anführungszeichen ist etwas tricky. Insbesondere darf beim Programmaufruf nur der Pfad in Anführungszeichen stehen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 04.06.2017, 08:19 Titel: |
|
|
bzw. (wenn ich es richtig sehe; kann es gerade nicht testen):
Code: | Shell "start /wait /b ""C:\Program Files (x86)\Java\jre1.8.0_121\bin\"" javaw.exe -ea -jar ""G:\javafo.jar"" ""G:\javafo_in.txt"" -p > ""G:\javafo_out.txt"" -w" |
wobei /wait das Warten auf das Programmende veranlasst und /b das Öffnen eines neuen Fensters verhindert - ist aber alles nur auf die Schnelle im Netz angelesen.
Und natürlich den ganzen Befehl in einer einzigen Zeile! _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 04.06.2017, 11:18 Titel: |
|
|
nemored hat Folgendes geschrieben: | bzw. (wenn ich es richtig sehe; kann es gerade nicht testen):
Code: | Shell "start /wait /b ""C:\Program Files (x86)\Java\jre1.8.0_121\bin\"" javaw.exe -ea -jar ""G:\javafo.jar"" ""G:\javafo_in.txt"" -p > ""G:\javafo_out.txt"" -w" |
wobei /wait das Warten auf das Programmende veranlasst und /b das Öffnen eines neuen Fensters verhindert - ist aber alles nur auf die Schnelle im Netz angelesen.
Und natürlich den ganzen Befehl in einer einzigen Zeile! |
Funktioniert leider nicht! Schön wäre es. Deswegen verwende ich ja schon die ganze Zeit, die Batch-Datei.
Zitat: | Off-Topic: Deine Java-Version ist veraltet. Aktuell ist gerade im Moment 8u131. Gerade bei Webbrowsern, Flash und Java sollte man bei den Sicherheitsupdates immer auf der Höhe sein. | Veraltet ist nur der Name! Ich verwende die aktuelle Version. Zumindest sollte es so sein?
Wie wäre es damit?
Code: | ShellExecute(NULL, "open", "javafo.bat", NULL, NULL, SW_HIDE) |
Fenster ist zwar weg, aber es wird nicht gewartet! _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 04.06.2017, 17:21 Titel: |
|
|
Auch wenn es mich wundert, wenn du einen Programmaufruf (egal mit wie vielen Parametern) nicht über SHELL starten können solltest - über SHELL kannst du auch Batch-Dateien starten. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
|