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 !?