Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Warten bis Datei da ist und nicht hinein geschrieben wird?
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 30.05.2017, 19:00    Titel: Warten bis Datei da ist und nicht hinein geschrieben wird? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 30.05.2017, 20:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 30.05.2017, 20:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 31.05.2017, 00:30    Titel: Antworten mit Zitat

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:

Code:
SHELL("text.bat")


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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 31.05.2017, 21:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 01.06.2017, 07:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 01.06.2017, 09:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 01.06.2017, 11:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 01.06.2017, 17:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 01.06.2017, 22:19    Titel: Antworten mit Zitat

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! grinsen ) 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 03.06.2017, 02:51    Titel: Antworten mit Zitat

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! grinsen ) 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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 03.06.2017, 19:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 03.06.2017, 21:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 03.06.2017, 23:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 04.06.2017, 00:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 04.06.2017, 01:05    Titel: Antworten mit Zitat

Off-Topic: Deine Java-Version ist veraltet. zwinkern Aktuell ist gerade im Moment 8u131. Gerade bei Webbrowsern, Flash und Java sollte man bei den Sicherheitsupdates immer auf der Höhe sein.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 04.06.2017, 01:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 04.06.2017, 07:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 04.06.2017, 10:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 04.06.2017, 16:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz