AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

1 Datei und 2 Prozesse ...

Ein Thema von moelski · begonnen am 10. Mär 2009 · letzter Beitrag vom 11. Sep 2009
Antwort Antwort
Seite 1 von 3  1 23      
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 06:51
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
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: 1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 06:53
Schreibe doch die Werte in eine DB o.ä. und erzeuge dann das Bild dynamisch bei Anforderung
Markus Kinzler
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: 1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 07:05
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.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: 1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 07:08
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#5

Re: 1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 08:44
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#6

Re: 1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 08:48
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.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#7

Re: 1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 09:38
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: 1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 09:46
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;
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#9

Re: 1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 10:07
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.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: 1 Datei und 2 Prozesse ...

  Alt 10. Mär 2009, 10:13
Hallo,

eigentlich nix gegen einzuwenden,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).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:56 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