Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Vista: Dateizugriff langsamer? (https://www.delphipraxis.net/117253-vista-dateizugriff-langsamer.html)

Graffi 14. Jul 2008 22:20


Vista: Dateizugriff langsamer?
 
Hallöchen,

ich habe mal wieder ein kleines Problem mit Vista:

- 2 kleinere Anwendungen tauschen sich via einer simplen Textfile aus
- Anwendung 1 schreibt alle 500ms in das Textfile (max. 20 Zeilen)
- Anwendung 2 liest alle 510 ms das Textfile

(Den kleinen Zeitversatz habe ich eingebracht, falls beide Anwendungen gleichzeitig gestartet würden.)

Anyway, unter 98-XP funktioniert das wunderbar.

Unter Vista blockiert die Anwendung 2 das Schreiben der Anwendung 1. Beende ich Anwendung 2, kann Anwendung 1 wieder wunderbar schreiben.

Ist Vista hier nur langsamer? Oder hat das evtl. noch andere Ursachen?

Grüße, Graffi

Luckie 14. Jul 2008 22:38

Re: Vista: Dateizugriff langsamer?
 
Zum einem würde ich das nicht so synchronisieren, da Timer-Nachrichten keine sehr hohe Priorität im System haben, es ist also nicht garantiert, dass das Timer-Ereignis auch immer "pünktlich" ausgelöst wird. Windows ist eben kein Echtzeit betriebssystem. Zum anderen, wie öffnest du die datei und schließt du sie auch wieder, damit sie von der anderen Anwendung zum Lesen geöffnet werden kann.

Zum Datenaustausch würde ich mir andere Möglichkeiten der Interprozesskommunikation überlegen. Du kannst es ruhig mit Dateien machen, aber dann würde ich der anderen Anwendung eine Nachricht schicken, wann sie lesen kann.

Für kleine Datenmengen eigent sich auch die Nachricht MSDN-Library durchsuchenWM_COPYDATA. Ansonsten würde ich mich mal nach MemoryMappedFiles oder (Named)Pipes oder Mailslots umgucken.

RavenIV 15. Jul 2008 08:20

Re: Vista: Dateizugriff langsamer?
 
Zitat:

Zitat von Graffi
- Anwendung 1 schreibt alle 500ms in das Textfile (max. 20 Zeilen)
- Anwendung 2 liest alle 510 ms das Textfile

Das ist nicht sehr schlau gelöst.
a) Timer laufen nicht genau und auch nicht verlässlich. Es ist vorgegeben, dass der Timer dann frühestens alle 500 ms ausgelöst wird, es können aber auch mal 800 ms oder 1200 ms sein, wobei es nie 400 ms sein werden.
b) Anwendung2 überhplt irgendwann Anwendung1. Dann wird ein Zyklus nicht gelesen, sondern übersprungen.

Als Lösung würde ich NamedPipes vorschlagen.
Da kann Anwendung2 warten, bis Daten ankommen und diese dann auslesen.
Vorteile:
- nur ein Timer, diesen vielleicht noch durch Delay ersetzen
- Anwendung1 bekommt die volle Steuerung
- Anwendung2 muss nur reagieren, wenn wirklich Daten kommen

Überdenke also das Software-Design nochmal.
Man kann alles irgendwie besser lösen.

Luckie 15. Jul 2008 08:39

Re: Vista: Dateizugriff langsamer?
 
Das habe ich doch gestern schon alles geschrieben. :gruebel:

RavenIV 15. Jul 2008 08:43

Re: Vista: Dateizugriff langsamer?
 
Zitat:

Zitat von Luckie
Das habe ich doch gestern schon alles geschrieben. :gruebel:

Ich wollte es nur noch ein Wenig erweitern und anderst erklären. :roll:

/ironie
Und ausserdem will ich die 3000 vollmachen, bevor ich mich verabschiede ;-)

Luckie 15. Jul 2008 09:06

Re: Vista: Dateizugriff langsamer?
 
Hier ist noch mal ein Beispiel für Interprozesskommunikation mit MemoryMappedFiles:
http://www.michael-puff.de/Developer...ppets/MMF.html

Graffi 15. Jul 2008 20:18

Re: Vista: Dateizugriff langsamer?
 
Danke euch Zweien für die guten Antworten.

Meine Timerlösung ist zwar nicht das Gelbe vom Ei, aber hat bislang völlig ausgereicht, da absolut nicht zeitkritisch.

@Luckie
Lesen und Schreiben des Textfiles mache ich derzeit über:

Delphi-Quellcode:

tf : textfile;
s : string;


//Schreiben - Anwendung 1

     try
         assignfile(tf,PStatus+'info.txt');
         rewrite(tf);
         writeln(tf,s);
         ...
         closefile(tf);
     except
         //showmessage('Fehler');
     end;

//Lesen - Anwendung 2

begin
     Result := false;
     try
       assignfile(tf,pstatus+'info.txt');
       reset(tf);
       readln(tf,s);
       ...
       closefile(tf);
       Result := true;
     except
       Result := false;
     end;
end;
Wie schon gesagt, unter 98-XT macht das überhaupt keine Probleme.

Gruß Ralf


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz