Einzelnen Beitrag anzeigen

moelski

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

Re: 1 Datei und 2 Prozesse ...

  Alt 11. Sep 2009, 06:12
Moin !

Ich muss diesen Fred nochmal aufgreifen. Irgendwie bin ich mit der jetzigen Lösung noch nicht im Reinen.
while FileInUse(LPathname) do Application.ProcessMessages; Sowas widerstrebt mir irgendwie genauso wie Sleep Aufrufe.

Habe jetzt folgende Idee ...

Generell gibt es ja 2 Prozesse die vollkommen asynchron zueinander laufen:
1) Speichern der Webseite
Das speichern erfolgt in einen Temp Ordner. Aufgerufen wird das Speichern der Webseite in unserem Programmlauf. Und zwar dann wenn die Grafik definitiv komplett gezeichnet ist. Das klappt aber eh ...
Gespeichert wird nur (!) SaveDone = False. SaveDone = Boolwert - zeigt das die Webseite neu im Temp abgespeichert wurde und das Speichern abgeschlossen ist. Nach dem Speichern der Seiteninfos SaveDone = True setzen.
Mehr passiert hier nicht - darf auch nicht um den normalen Programmablauf nicht unnötig zu stören.

2) Laden der Webseite aus dem Browser
Jetzt kommt der heikele Part. Denn das Laden der Webseite kann ja z.B. theoretisch von 100 Browsern im Sekundentakt erfolgen. Bei jedem Lesen wird das Event HTTPServer_CommandGet ausgelöst.
Ich klammere deshalb das ganze Lesen mit dem Inkementieren und Dekrementieren eines Counter - nennen wir ihn mal Z.

Also sowas:
Delphi-Quellcode:
INC(Z);
  //.... HTTPServer_CommandGet Code
DEC(Z);
Daraus kann man dann folgende Schlüsse ziehen:
- ist der Counter = 1 dann ist das CommandGet aktuell nur 1x am laufen.
- ist der Counter > 1 dann sind gerade mehrere Leseoperationen am Webserver aktiv.

Wenn der Counter = 1 ist UND SaveDone = True dann wird das Lesen der Webseite geblockt.
Jetzt kopiere ich den Kram vom Temp Ordner ins Webserververzeichnis.
Temp Verzeichnis löschen.
Block aufheben.
SaveDone = False

In Code sähe das dann in etwa so aus:
Delphi-Quellcode:
INC(Z);
  if (Z = 1) AND (SaveDone = True) Then begin
    BlockReading := True;
    // ... COPY Temp to Webfolder
    // ... CLEAR Temp folder
    BlockReading := False;
    SaveDone := False
  End;
  //.... HTTPServer_CommandGet Code
DEC(Z);
Könnte mir vorstellen das es so ganz gut funktioniert. Genaugenommen ist es zwar immer noch nicht 100%ig, denn wenn genau zwischen "if (Z = 1) AND (SaveDone = True) Then " und "BlockReading := True;" eine neue Leseanforderung kommt, denn könnte es wieder zu Problemen kommen. Aber da unser Webserver dafür eingesetzt wird, eine Chart Grafik darzustellen und wir einen Refresh von 20 Sekunden haben, sollte das verschmerzbar sein.

Evtl. könnte man das auch noch etwas abfangen wenn man nach dem INC(Z) erst ein
BlockReading := (Z = 1) AND (SaveDone = True); aufrufen würde.

Jedenfalls wäre das eine Lösung die ohne grossartige Sleeps oder sonstige Wartezyklen auskäme.

Oder habe ich was gravierendes übersehen !?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat