Autor Beitrag
Flugbein
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 25.11.11 15:11 
Hallo zusammen, folgendes Problem: Ich möchte in eine Textdatei in regelmäßigen Zeitabständen mitten in den Text an eine Stelle Werte eintragen. Dafür benutze ich eine Stringliste, paßt soweit, d.h. stringliste erzeugen, auslesen, bearbeiten, einlesen, free. Nun soll aber ebenso in regelmäßigen Abständen ein zweites Programm auf diese Datei zugreifen, um Werte auszulesen, wobei es Kollisionen gibt. Meine Fragen:
Wenn ich eine stringlist wie oben benutze, wird dann die Datei automatisch geöffnet und geschlossen?
Kann ich der Datei mehrfachen Zugriff erlauben?
Kann ich die Datei öffnen, dann den Prozeß mit der stringlist durchführen und sie wieder schließen (habs mit Assignfile und Closefile etc probiert, erhalte aber die Fehlermeldung daß schon ein anderer Prozeß etc... scheint also nicht zu gehen, daß zweite Programm war da übrigens nicht an)? Würde das die Kollisionen vermeiden?
Wenn ich Append dafür verwende, ist mir nicht klar, wie ich das (konstante) Endstück des Textes beibehalten kann, das müßte ich ja jedesmal beim Öffnen löschen, was aber wieder eine Stringlist erfordert...
Falls die Fragen bescheuert sind, nix für ungut, bin Anfänger und habe auch schon lange gegoogelt, ehrlich ;)
Vielen Dank im Voraus
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 25.11.11 15:40 
Über saveToFile und loadFromFile sollte er nach dem schreiben das ganze wieder freigeben. Lesend sollten theoretisch auch beide Programme gleichzeitig zugreifen können. Das kommt aber auf die Funktion zum Lesen an.
Aber wenn beide Programme über die stringliste Werte lesen und schreiben solltest du keine Probleme haben.
Zusätzliches Fehler handling wäre noch wichtig.
Flugbein Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 25.11.11 15:50 
Danke für die schnelle Antwort !! :) Nun, es greift nur ein Program schreibend mit der Stringlist zu, das zweite Programm ist Google Earth, welches lesend über einen Netzwerklink zugreift, einmal/Sekunde. Leider hängt sich der Networklink ab und an auf, was ich nur manuell wieder beheben kann.
Also: Mein Program schreibt 10/s eine neue Zeile mittels stringlist rein, GE liest 1/s alles aus. That's it.
Könntest Du mir ein paar Hinweise bezüglich möglichen Fehlerhandlings geben? (Anfänger...)
Vielen Dank!!
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 25.11.11 15:51 
Wenn der Endteil fix bleibt und ich Dich richtig verstanden habe würde ich zu schreiben einen Stream verwenden der Ende - Fixteil anläuft und die neuen Daten + Fixteil schreibt. Das ganze mit fmOpenReadWrite or fmShareExclusive.

Der lesende Prozess versucht zu öffnen mit fmOpenRead or fmShareDenyWrite..

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Flugbein Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 25.11.11 17:30 
ok, danke. lese mich mal in streams ein. Vielleicht ein paar kleine Hinweise, wie man eine Stelle in der Datei anläuft, einen string einliest, alles wieder zurückgibt etc? .... Wär cool, danke
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 25.11.11 17:56 
Wenn am Ende ein bestimmter Text stehen soll, dann ist das so nicht lösbar. :nixweiss:

Denn egal was du machst, sobald du die Datengröße änderst, musst du diesen Text neu an das Ende schreiben. Und wenn dabei gerade gelesen wird, bekommt das lesende Programm korrupte Daten. Wenn es damit nicht umgehen kann, war es das dann...

Genau aus diesem Grund gibt es Datenbanken usw.
Flugbein Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 25.11.11 18:02 
Gut, ich sehe schon, ich komme wohl um die Datenbankgeschichte nicht herum. Empfehlungen für gute tutorials zum Thema Datenbanken/Delphi etc...?

Moderiert von user profile iconNarses: Beiträge zusammengefasst

oder kann mir vielleicht jemand Tips geben, wie man das Problem mit Semaphoren löst o.ä. ?!
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 25.11.11 22:33 
@jaenicke

das ganze scheint mir eigentlich nur ein Problem der korrekten Zugriffsmethoden, bzw. "Berechtigungen" zu sein

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 25.11.11 23:35 
Naja, aber wie soll das funktionieren, wenn halbe Datensätze gelesen werden und der Endtext auch nicht vorhanden ist. Wie ich geschrieben habe: Wenn das Zielprogramm damit klarkommt, ist alles ok. Dann würde man aber auch keinen Endtext benötigen...
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Sa 26.11.11 00:26 
@jaenicke
was ich meinte ist, wenn das unwissende Zielprogramm auf die Datei/den Stream nicht zugreifen kann, wegen der Art wie der Stream geöffnet wird, muss es sich eigentlich nur um die entstehende Exception kümmern und es erneut versuchen.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Erichgue
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 86

Win XP/2000/7
TurboPacal 7.0; Delphi 2/5/7; BDS 2006/2010/XE6; C#; MSSQl 2000
BeitragVerfasst: Mo 28.11.11 16:07 
Hallo Zusammen,
ich beiß mir bei dem Thema auch die Zähne aus.

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Wenn der Endteil fix bleibt und ich Dich richtig verstanden habe würde ich zu schreiben einen Stream verwenden der Ende - Fixteil anläuft und die neuen Daten + Fixteil schreibt. Das ganze mit fmOpenReadWrite or fmShareExclusive.

Der lesende Prozess versucht zu öffnen mit fmOpenRead or fmShareDenyWrite..


Wenn ich das so anwende:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Var fFileWriter1 : TFileStream;
    fFileReader1 : TFileStream;
begin
  fFileWriter1 := TFileStream.Create(CFileName, fmOpenReadWrite or fmShareExclusive);
  fFileReader1 := TFileStream.Create(CFileName, fmOpenRead or fmShareDenyWrite);


meckert "FileReader1" das die Datei durch einen anderen Prozess bereits verwendet wird.
Was nun?

Gruß

Erich
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 28.11.11 16:41 
user profile iconErichgue hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
  fFileWriter1 := TFileStream.Create(CFileName, fmOpenReadWrite or fmShareExclusive);
  fFileReader1 := TFileStream.Create(CFileName, fmOpenRead or fmShareDenyWrite);
Naja, du öffnest die Datei erstens komplett exklusiv. Da ist sowieso kein paralleler Zugriff möglich. Und zweitens öffnest du sie zum Lesen und Schreiben und versuchst sie danach mit einer Sperre fürs Schreiben zu öffnen. :?!?:
Erichgue
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 86

Win XP/2000/7
TurboPacal 7.0; Delphi 2/5/7; BDS 2006/2010/XE6; C#; MSSQl 2000
BeitragVerfasst: Mo 28.11.11 16:55 
Zitat:

user profile icon hat folgendes geschrieben Zum zitierten Posting springen:
Naja, du öffnest die Datei erstens komplett exklusiv. Da ist sowieso kein paralleler Zugriff möglich. Und zweitens öffnest du sie zum Lesen und Schreiben und versuchst sie danach mit einer Sperre fürs Schreiben zu öffnen. :?!?:


Nun, so hatte es bumi vorher geschrieben. :gruebel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Var fFileWriter1 : TFileStream;
    fFileReader1 : TFileStream;
    fBuffer      : Pointer;
begin
  fFileWriter1 := TFileStream.Create(CFileName, fmOpenWrite, fmShareDenyWrite);
  fFileReader1 := TFileStream.Create(CFileName, fmOpenRead);
  ...


Geht eben auch nicht.

Gruß

Erich
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 28.11.11 17:54 
Da hat er sich ein wenig vertan. Versuch mal fmShareDenyNone. ;-)
Mehr Infos siehe Hilfe:
docwiki.embarcadero....s.TFileStream.Create
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 28.11.11 19:45 
@jaenicke

wo hatte ich mich vertan?
Ich dachte die Daten sollen Konsistent gelesen und geschrieben werden, was bedeutet dass immer nur einer der Prozesse "gleichzeitig" zugreifen kann, oder wo habe ich den Knopf?

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 29.11.11 07:20 
Naja, die ursprüngliche Frage war eben genau, dass der Zugriff exakt parallel erfolgen sollte. ;-)

Aber stimmt, ich sehe schon wie du das meintest. Nur müsste dann bei beiden Vorgängen auch so lange versucht werden zuzugreifen bis das klappt.