Mit 4 Units auf eine Datei zugreifen - Speicherproblem

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
MTB1Leo
Beiträge: 32
Registriert: Do 20. Mär 2014, 18:00

Mit 4 Units auf eine Datei zugreifen - Speicherproblem

Beitrag von MTB1Leo »

Hallo,

Ich schreibe z.Z. an einem Programm, welches 4 Units verwendet, welche alle auf zwei Dateien zugreifen.

Nun habe ich festgestellt, dass die Units die Dateien nicht ordnungsgemäß abspeichern bzw. laden.

Es werden ein Feld und ein Verbund gespeichert, jeder in einer eigenen Datei.

Unit 1 greift bei Programmstart auf beide zu und lädt die Werte um sie anzuzeigen. [Funktioniert]
Ich öffne Unit 2, verändere den Verbund und speichere und schließe den Verbund. [Funktioniert]
In Unit 1 wird die Ansicht aktualisiert, heißt die mit Unit 2 eingegebenen Werte werden angezeigt. [Funktioniert noch]
Ich öffne Unit 3, sie zeigt jedoch die alten Werte an, welche beim Programmstart aus dem Verbund geladen wurden. [Funktioniert also nicht]
Unit 3 speichert nun die alten Werte wieder in den Verbund, was das Programm unbrauchbar macht.


Liege ich richtig in der Annahme, dass die Units die Dateien aktualisieren müssten um auf sie zuzugreifen?
Ich habe versucht, die Units als einzelne Programme auszulagern, und anstatt Unit 1 P1 als Programm aufzurufen, löst das das Problem?

GIbt es, außer einer Datenbank, einen anderen Weg, das Programm ordnungsgemäß zum Laufen zu bringen?

Edit:

Ich habe die Units jetzt als externe Programme geschrieben, die mit ExecuteProcess aufgerufen werden. Dabei sollen die Dateien ebenfalls geladen werden, ich bekomme aber die Fehlermeldung "Invalid filename" und die Werte werden nicht geladen.
Ich habe versucht Daten zu laden, welche nicht zeitgleich von dem Hauptprogramm verwendet werden, aber es wurde nicht besser..

Wo liegt hier der Fehler? :/

Danke im Voraus!

MTB1Leo
750GB HDD CPU: i3 boost 3.6Ghz RAM: 12GB GPU: ASUS RADEON R7 270X DC II

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Mit 4 Units auf eine Datei zugreifen - Speicherproblem

Beitrag von Antrepolit »

1. Redest du von Dateien oder von einer Datenbank? Was für eine Datei und WIE greifst du darauf zu? Ich sehe nicht eine Zeile Programmcode und nur der dürfte interessant sein.
2. Was meinst du mit "Verbund"?
3. Poste den Quellcode, da du nicht die korrekten Fachtermini benutzt und so ohnehin niemand weiß, wovon du redest.
4. Will ich dich nicht "fertig machen"; meine Antworten sind bloß kurz und gut gemeinte Ratschläge.
Grüße, Antrepolit

care only if your os is really burning

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Mit 4 Units auf eine Datei zugreifen - Speicherproblem

Beitrag von baumina »

Sinnvoll ist es eine Klasse zu haben die sich ausschließlich um das Halten der Daten, das Lesen und Speichern der Daten von und auf die Festplatte kümmert. Diese Klasse machst du dann projektweit gültig und sagst in den einzelnen Units nur noch sowas wie Klasse.LeseDaten und Klasse.SchreibeDaten und Klasse.Daten.Irgendwas.
.

MTB1Leo
Beiträge: 32
Registriert: Do 20. Mär 2014, 18:00

Re: Mit 4 Units auf eine Datei zugreifen - Speicherproblem

Beitrag von MTB1Leo »

Also ich nutze keine Datenbank, sondern folgenden Code um zu speichern:

Code: Alles auswählen

 
 
procedure TForm1.Speichern;
var
  s: file of BANK; // BANK ist ein Feld mit 12 Bereichen, welche alle aus dem Verbund(reconrd) bestehen. 
  E: file of GENRL; // GENRL ist ein Verbund mit verschiedenen Typen. 
begin
    AssignFile(s, 'src/data/BANK.bank');
    Rewrite(s);
    Write(s, M);  // Daten schreiben
    CloseFile(s);
 
 
    AssignFile(E, 'src/data/GENRL.bank');
    Rewrite(E);
    Write(E, G);  // Daten schreiben
    CloseFile(E);
 
  end;
 
 
Sind die Units integriert, ist diese Prozedur (und die entsprechende Ladeprozedur) in jeder Prozedur vorhanden.

GENRL bzw. BANK sind in den jeweiligen Units unter type deklariert.


Bei der Variante in der die Units als eigenständige Programme laufen und per

Code: Alles auswählen

ExecuteProcess('src\Monetus - Werte anpassen.exe',''); 
aufgerufen werden, sind die Prozeduren ebenfalls vorhanden.

Hier wird jedoch beim Ausführen des Programms eine Fehlermeldung angzeigt. Monetus - Werte anpassen stellt fest "Invalid filename" und lädt GENRL bzw. BANK nicht. Die Datenbezeichnungen und der Code stimmen jedoch überein.
750GB HDD CPU: i3 boost 3.6Ghz RAM: 12GB GPU: ASUS RADEON R7 270X DC II

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Mit 4 Units auf eine Datei zugreifen - Speicherproblem

Beitrag von marcov »

MTB1Leo hat geschrieben: Bei der Variante in der die Units als eigenständige Programme laufen und per

Code: Alles auswählen

ExecuteProcess('src\Monetus - Werte anpassen.exe',''); 
aufgerufen werden, sind die Prozeduren ebenfalls vorhanden.

Hier wird jedoch beim Ausführen des Programms eine Fehlermeldung angzeigt. Monetus - Werte anpassen stellt fest "Invalid filename" und lädt GENRL bzw. BANK nicht. Die Datenbezeichnungen und der Code stimmen jedoch überein.

Hört sich an als ein Problem mit der Arbeits Ordner ( (?!?) Working Directory). Writeln mal [url]http://www.freepascal.org/docs-html/rtl/sysutils/getcurrentdir.htm]Getcurrentdirl[/url] in angerufene Programm (monetus - werte anpassen).

Hüte auch dafür das unter Windows File Locks ein paar Sekunden "hängen", also wenn ein Programm ein Bestand schließt kann ein anderes Programm das selben bestand nicht immer unmittelbar offenen. Es kann sich da ein paar hundert ms Verzögerung auftreten, länger wenn das System extrem tätig ist.

Antworten