Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   1 Datei und 2 Prozesse ... (https://www.delphipraxis.net/130535-1-datei-und-2-prozesse.html)

moelski 10. Mär 2009 06:51


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:

mkinzler 10. Mär 2009 06:53

Re: 1 Datei und 2 Prozesse ...
 
Schreibe doch die Werte in eine DB o.ä. und erzeuge dann das Bild dynamisch bei Anforderung

moelski 10. Mär 2009 07:05

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.

alzaimar 10. Mär 2009 07:08

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.

himitsu 10. Mär 2009 08:44

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.

moelski 10. Mär 2009 08:48

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.

himitsu 10. Mär 2009 09:38

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.

nahpets 10. Mär 2009 09:46

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;

moelski 10. Mär 2009 10:07

Re: 1 Datei und 2 Prozesse ...
 
Moin !

Ich habe das jetzt so gelöst:

Delphi-Quellcode:
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;
Das ist der Code für den Webserver (Anfrage vom Client).

Und hiermit überprüfe ich ob die Datei in Benutzung ist:
Delphi-Quellcode:
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;
Bis jetzt geht das ganz gut. Ob es der Weisheit letzter Schluss ist .. Weiss ich noch nicht.

nahpets 10. Mär 2009 10:13

Re: 1 Datei und 2 Prozesse ...
 
Hallo,

eigentlich nix gegen einzuwenden,
Delphi-Quellcode:
while FileInUse(LPathname) do Application.ProcessMessages;
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).


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 Uhr.
Seite 1 von 3  1 23      

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