![]() |
1 Datei und 2 Prozesse ...
Moin !
Ich habe hier ein kleines Problem und mir fällt einfach keine wirklich gute Lösung ein :? Also ... Ich habe einen kleinen Indy Webserver. Der stellt eine HTML Seite und eine Grafik zur Verfügung. Die Grafik wird alle 20 Sekunden neu geschrieben (ist von einem TChart). Nun muss aber der Webserver selber immer dann die Grafik neu lesen wenn ein Browser die Seite anfordert. Und da entsteht irgendwann das Problem das sich beide Prozesse überschneiden. Nun habe ich mir schon gedacht eine Temp Datei zu schreiben und dann nur noch die Datei per CopyFile auf die richtige Datei zu überschreiben. Aber auch da gibts irgendwann mal das Problem das der Copy Vorgang noch aktiv ist und die Datei gelesen werden soll. Hat jemand ne gute Idee wie man dieses Problem in den Griff bekommt. Denn die beiden Sachen Lesen / Schreiben laufen vollkommen asynchron. Ach ja und die Grafik speichern bei jeder Anforderung durch die Webseite geht auch nicht. Denn da die Grafik jede Sekunde erweitert wird kann ich nur zu bestimmten Zeiten die Grafik wegschreiben. Weiterhin hat man auch wieder das Problem das 2 Browser parallel auf den Server zu greifen und dann ggf. 2x überlappend die Datei geschrieben werden soll. Verzwacktes Problem :gruebel: |
Re: 1 Datei und 2 Prozesse ...
Schreibe doch die Werte in eine DB o.ä. und erzeuge dann das Bild dynamisch bei Anforderung
|
Re: 1 Datei und 2 Prozesse ...
Moin !
Nein das geht aus verschiedenen Gründen nicht. Das ist ein Livelogging und wir wollen zwar demnächst eine Dtaenbank verwenden, aber die Einzelwerte stehen da dann nicht drin. Ich glaube das würde in Summe auch zu viel Zeit kosten jeweils die Grafik neu zu berechnen. |
Re: 1 Datei und 2 Prozesse ...
Reicht es nicht, wenn der lesende Prozess bei Problemen einfach kurz wartet und es dann nochmals probiert? Beim Einlesen öffnest Du dann die Datei mit fmShareDenyNone, sodaß jeder Andere auch auf die Datei zugreifen darf.
Alternativ kopierst Du bei Bedarf deine Datei und liest dann die Kopie ein. |
Re: 1 Datei und 2 Prozesse ...
Und warum lößt du das Ganze nicht Serverseitig?
also das Lesen (an die Brower übergen) z.B. per PHP und dabei auch gleich das tauschen der dort befindlichen Datei. |
Re: 1 Datei und 2 Prozesse ...
Moin !
Der Server ist meine Anwendung. Ich nutze die Indy HTTP Komponente. Und ich wollte das ganze eigentlich eher simpel halten - sprich einfache HTML Seite + Grafik. |
Re: 1 Datei und 2 Prozesse ...
du könntest auch einfach 2 Dateien nehmen
eine wird grad geschrieben und die andere ist für die Ausgabe. und dann wird jeweils gewechselt. |
Re: 1 Datei und 2 Prozesse ...
Hallo,
mal der Versuch einer "schmutzigen" Lösung:
Delphi-Quellcode:
Var
iError : Integer; ms : TFileStream; bOk : Boolean; begin ... ms := TMemoryStream.Create; iError := 0; bOk := False; Repeat try ms.LoadFromFile('Dateiname'); Response.ContentType := 'image/jpeg'; Response.SendStream(ms); Response.SendResponse; bOk := True; except inc(iError); Sleep(500); // probieren, wie lange dauert das Erstellen der Datei gewöhnlich? end; until bOk or (iError > 3); ms.Free; if Not bOk then begin Fehlerbehandlung... end; ... end; |
Re: 1 Datei und 2 Prozesse ...
Moin !
Ich habe das jetzt so gelöst:
Delphi-Quellcode:
Das ist der Code für den Webserver (Anfrage vom Client).
procedure TLV_HTTP_Server.HTTPServer_CommandGet(AContext : TIdContext;
ARequestInfo : TIdHTTPRequestInfo; AResponseInfo : TIdHTTPResponseInfo); var LFilename: string; LPathname: string; begin LFilename := ARequestInfo.Document; if (LFilename = '/') or (LFilename = '/PageResult') then begin LFilename := '/index.html'; end; LPathname := HTMLDir + LFilename; if FileExists(LPathname) then begin while FileInUse(LPathname) do Application.ProcessMessages; AResponseInfo.ContentStream := TFileStream.Create(LPathname, fmOpenRead + fmShareDenyNone); //fmShareDenyWrite); end else begin AResponseInfo.ResponseNo := 404; AResponseInfo.ContentText := 'The requested URL ' + ARequestInfo.Document + ' was not found on this server.'; end; end; Und hiermit überprüfe ich ob die Datei in Benutzung ist:
Delphi-Quellcode:
Bis jetzt geht das ganz gut. Ob es der Weisheit letzter Schluss ist .. Weiss ich noch nicht.
function FileInUse(FileName: string): Boolean;
var hFileRes: HFILE; begin Result := False; if not FileExists(FileName) then exit; hFileRes := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Result := (hFileRes = INVALID_HANDLE_VALUE); if not Result then CloseHandle(hFileRes); end; |
Re: 1 Datei und 2 Prozesse ...
Hallo,
eigentlich nix gegen einzuwenden,
Delphi-Quellcode:
könnte aber in ungünstigen Situationen zu einer Endlosschleife werden (wenn z. B. der dateischreibende Prozess sich weghängt und die Datei nicht freigibt).
while FileInUse(LPathname) do Application.ProcessMessages;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz