AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi E/A-Fehler 103 bei Speichern mittels FileStream
Thema durchsuchen
Ansicht
Themen-Optionen

E/A-Fehler 103 bei Speichern mittels FileStream

Ein Thema von MStoll · begonnen am 12. Jun 2006 · letzter Beitrag vom 12. Jun 2006
 
MStoll

Registriert seit: 15. Nov 2005
131 Beiträge
 
Turbo Delphi für Win32
 
#1

E/A-Fehler 103 bei Speichern mittels FileStream

  Alt 12. Jun 2006, 11:28
Hi

ich bekomme bei folgendem Code sporadisch E/A-Fehler 103. Dies ist eine Speicher-Prozedur aus einer DLL, die mit verschiedenen Programmen auf verschiedenen Rechnern verwendet wird. Ich muss dazusagen, dass mittels diesen Codes 1 Programm dauernd in eine Datei schreibt, während 2 andere Programme auf 2 anderen Rechnern in festen Intervallen lesend auf sie zugreifen. Sozusagen ein asynchroner Zugriff von 3 Parteien.

Delphi-Quellcode:
procedure save_zeiten_rdt_(const filename : string; const zeiten : tzeiten; count : integer = 1);
var fs : TFileStream;
    x, i : integer;
begin
     fs := nil;
     i := 0;

     {$I-}
     while (fs = nil) and (i < 10) do
     begin
          try
             fs := TFileStream.Create(filename, fmCreate or fmShareExclusive);
          except
             if fs <> nil then
                fs := nil;
          end;
          Sleep(5);
          inc(i);
     end;
     {$I+}
     
     if ((IOResult <> 0) or (fs = nil)) and (count < 5) then
     begin
          Sleep(50);
          save_zeiten_rdt_(filename, zeiten, count+1);
          fs := nil;
     end
     else if count >= 5 then
          exit;

     if fs = nil then
        exit;

     try
        try
           for x := 0 to high(zeiten) do
               fs.WriteBuffer(zeiten[x].zeit, sizeof(zeiten[x].zeit));
        finally
            fs.Free;
        end;
     except
     end;

     if length(zeiten) = 0 then
        SysUtils.DeleteFile(filename);
end;
Die Leseprozedur sieht so aus:
Delphi-Quellcode:
function read_zeiten_rdt(const filename : string; out ok : boolean; out fehlercode : integer) : tzeiten;
var x, i : integer;
    fs : TFileStream;
begin
       ok := true;
       fehlercode := 0;

       x := 0;
     i := 0;
     fs := nil;
       SetLength(result, x);

       if fileexists(filename) then
       begin
          while (fs = nil) and (i < 10) do
          begin
               try
                  fs := TFileStream.Create(filename, fmOpenRead or fmShareDenyWrite);
               except
                  if fs <> nil then
                     fs := nil;
               end;
               Sleep(5);
               inc(i);
          end;

          if fs = nil then
          begin
               ok := false;
               fehlercode := fdio;
               exit;
          end;

          try
             fs.Position := 0;
             while fs.Position < fs.Size do
             begin
                  SetLength(result, x+1);
                  try
                     fs.read(result[x].zeit, sizeof(tzeit));
                     result[x].ID := x;
                  except
                     SetLength(result, 0);
                     ok := false;
                     fehlercode := fdtype;
                     break;
                  end;
                  inc(x);
             end;
          finally
             fs.Free;
          end;
     end
     else
     begin
          ok := false;
          fehlercode := fdnofile;
     end;
end;
Der E/A-Fehler tritt allerdings nur bei der Schreib-Prozedur auf. Diese Prozedur wird von einem Hintergrundthread aufgerufen, der allein für das Schreiben dieser einen Datei zuständig ist.

Hat jemand eine Idee, was ich dagegen tun kann? Ich hab schon mehrere Sachen versucht, total überladene try...except-Konstrukte, Die E/A-Prüfung ausgeschaltet etc. Aber diese Exception mit dem E/A-Fehler dringt irgendwie immer bis ins Hauptprogramm durch (Auch wenn ich zugegebenermaßen noch kein Problem mit der Datei bemerkt hab, lediglich der Fehler an sich stört mich.)

Gruß Michael
  Mit Zitat antworten Zitat
 


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 02:23 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