AGB  ·  Datenschutz  ·  Impressum  







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

[Threads] Datei exklusiv öffnen

Ein Thema von sieppl · begonnen am 29. Sep 2004 · letzter Beitrag vom 29. Sep 2004
Antwort Antwort
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#1

[Threads] Datei exklusiv öffnen

  Alt 29. Sep 2004, 17:49
Hallo,

mein Programm zeigt in einer ListView Thumbs von Bildern.
Bei mir laufen 2 Threads. Ein Thread wartet auf Änderungen in dem gerade betrachteten Ordner.
(FindFirstChangeNotification). Sobald es eine gibt, wird der 2. Thread aufgeweckt und rendert
falls vorhanden, neue Thumbs hinzu. Das Ganze läuft eigentlich ganz gut.
Problem:
Wenn ich mehrere Bilder (100) in den Ordner kopiere wird FindNextChangeNotification mehrere Male ausgelöst, nicht nur einmal, wenn der komplette Kopiervorgang abgeschlossen ist. Ist auch ganz schön, dass es zwischendurch aktualisiert wird.
Nun rennt der 2. Thread los findet alle Bilder die zu einem bestimmtem Zeitpunkt schon vorhanden sind und versucht die Bilder zu rendern. Jetzt gibt es sporadische 'File Open Error' da auch Windows noch kopiert und der Thread wahrscheinlich auf manche Files zugreift, während diese sich noch in einem schwebenden Zustand befinden. Die File-Zugriffe sind natürlich in einem try-error Konstrukt, dass heißt der Bug fällt nicht auf, wenn ich die Exe ausführe, da der Thread zum Schluss sowieso nochmal drüberrennt und alle nicht gerenderten Bilder erwischt.
Das ist aber nicht sauber. Habt Ihr Ideen? Ich suche so eine Art exklusiven Zugriff oder eine Prüfung ob die Datei schwebend ist oder nicht. Gerne auch API-Befehle, das Programm besteht zum größten Teil aus ihnen..

Grüße

Sebastian
Sebastian
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: [Threads] Datei exklusiv öffnen

  Alt 29. Sep 2004, 18:15
Mit folgenden Funktionen kannst du prüfen, ob eine Datei im Zugriff von anderen Anwendungen ist:
Delphi-Quellcode:
function FileIsClosed(const filename:string):Boolean;
const
   FILE_SHARE_EXCLUSIVE = 0;
var
   hnd: THandle;
begin
   hnd := CreateFile(PChar(filename), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_EXCLUSIVE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

   result := hnd <> INVALID_HANDLE_VALUE;

   CloseHandle(hnd);
end;

function CheckIfFileExistsAndIsReadable(const AFileName: string): boolean;
begin
   Result := FileExists(AFileName) and FileIsClosed(AFileName);
end;
Ich würde aber trotzdem eine andere Vorgehensweise empfehlen:
bilde ein Liste der Dateien, für die ein Thumb erzeugt werden soll.
Die Liste wird abgearbeitet; bei Erfolg wird das Element aus der Liste gelöscht oder markiert,
bei Misserfolg eben nicht.
Nach Abarbeiten der Liste wird diese nochmals abgearbeitet, um die Misserfolge auszubügeln.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#3

Re: [Threads] Datei exklusiv öffnen

  Alt 29. Sep 2004, 18:16
Mit diesem Konstrukt fange ich viele Notifications erstmal ab und synchronisiere dann erst:
Delphi-Quellcode:
if WaitForSingleObject(FHandle, 500) = WAIT_OBJECT_0 then
      begin
        //catch mutliple notifications to enhance performance
        FindNextChangeNotification(FHandle);
        while WaitForSingleObject(FHandle, 500) = WAIT_OBJECT_0 do
          FindNextChangeNotification(FHandle);
        Synchronize(ExecuteOnChange);
      end;
Falls Ihr bessere Ideen habt, bitte posten!

Grüße

Sebastian
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#4

Re: [Threads] Datei exklusiv öffnen

  Alt 29. Sep 2004, 18:24
Zitat von shmia:
Mit folgenden Funktionen kannst du prüfen, ob eine Datei im Zugriff von anderen Anwendungen ist:
Delphi-Quellcode:
function FileIsClosed(const filename:string):Boolean;
const
   FILE_SHARE_EXCLUSIVE = 0;
var
   hnd: THandle;
begin
   hnd := CreateFile(PChar(filename), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_EXCLUSIVE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

   result := hnd <> INVALID_HANDLE_VALUE;

   CloseHandle(hnd);
end;

function CheckIfFileExistsAndIsReadable(const AFileName: string): boolean;
begin
   Result := FileExists(AFileName) and FileIsClosed(AFileName);
end;
Ich würde aber trotzdem eine andere Vorgehensweise empfehlen:
bilde ein Liste der Dateien, für die ein Thumb erzeugt werden soll.
Die Liste wird abgearbeitet; bei Erfolg wird das Element aus der Liste gelöscht oder markiert,
bei Misserfolg eben nicht.
Nach Abarbeiten der Liste wird diese nochmals abgearbeitet, um die Misserfolge auszubügeln.
Danke!
Den Code kann ich später noch gut gebrauchen. Bei mir war aber tatsächlich die große Anzahl von Notifications das Problem. Jetzt läuft alles viel performanter und die Zugriffsprobleme sind auch erledigt.
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:59 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