Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C# Bild lesen blockiert Datei? (https://www.delphipraxis.net/93004-bild-lesen-blockiert-datei.html)

Phoenix 30. Mai 2007 08:28


Bild lesen blockiert Datei?
 
Folgendes Problemchen: Ich habe eine Funktion, die ein Bild lädt:

Code:
private void btnLoadImage_Click(object sender, EventArgs e)
{
  String basedir = FW.Instance.SysParams["Stammdaten.Pfade.Bilder"].Value;
  dlgOpenFile.InitialDirectory = basedir;

  if (dlgOpenFile.ShowDialog() == DialogResult.OK
    && Path.GetDirectoryName(dlgOpenFile.FileName) == basedir)
  {
    edFilename.Text = Path.GetFileName(dlgOpenFile.FileName);
    _image = new Bitmap(dlgOpenFile.FileName);
    btnPreview.Enabled = true;
  }
}

private void btnPreview_Click(object sender, EventArgs e)
{
  LabelPreviewHelper.ShowPreview(_image);
}
Letztere macht nix anderes, als das Image auf ein Formular zu patschen und es anzuzeigen.

Problematisch ist nun, dass das die Datei komplett blockiert. Will heissen selbst wenn ich da aufräume und das Image explizit freigebe, kann ich die Datei dennoch nicht umbennenen oder gar löschen, bis ich die Anwendung beende. Das finde ich etwas doof. Spätestens nachdem ich das Formular schliesse sollte die Datei wieder freigegeben werden. Was muss ich da noch machen?

Luckie 30. Mai 2007 08:42

Re: Bild lesen blockiert Datei?
 
Eventuell verhält sich
Code:
new Bitmap
genauso wie ein FileStream, der die Datei ja auch erst wieder freigibt, wenn er selber wieder freigegeben wird. Du müsstest also das Bitmap wieder freigeben, wenn du es nicht mehr brauchst. Der GarbageCollector scheint da nicht ganz zu funktionieren, wie es scheint.

Phoenix 30. Mai 2007 08:44

Re: Bild lesen blockiert Datei?
 
...das wars.

Ein einfaches Image.Dispose() beim Schliessen vom Formular hat freilich nicht gereicht. Die GC manuell anzuschmeissen brachte dann den Erfolg. Strange. Danke :)

Jürgen Thomas 30. Mai 2007 08:47

Re: Bild lesen blockiert Datei?
 
Hallo Sebastian,

unter Delphi-Referenz durchsuchenBitmap-Konstruktor (String) steht als Hinweis:
Zitat:

Die Datei bleibt gesperrt, bis die Bitmap freigegeben wird.
Leider macht der GC, was er will (genauer: wann er will). Auch durch "Freigeben" der Bitmap wird häufig erst aufgeräumt, wenn die Applikation beendet wird.

Unter Bitmap nach laden in Picturebox gesperrt? findest Du Hinweise zur Lösung.

Gruß Jürgen

PS. Inzwischen hast Du selbst einen Weg gefunden. Ich lasse meinen Beitrag wegen des weiteren Lösungswegs trotzdem stehen.

Luckie 30. Mai 2007 09:01

Re: Bild lesen blockiert Datei?
 
@Phoenix: Keine Ursache. Schön dass ich dir helfen konnte. :thumb:

Elvis 30. Mai 2007 09:14

Re: Bild lesen blockiert Datei?
 
Zitat:

Zitat von Phoenix
Folgendes Problemchen: Ich habe eine Funktion, die ein Bild lädt:

Enthält mehrere Ecken, an denen man sich stoßen kann...
a) Sie benötigt zuviele lokale Privilegien (mag aber vielleicht nötig sein)
b) Der Konstruktor von SD.Bitmap ist von den Redmondern furchtbar dämlich implementiert worden.
Er öffnet einen Stream, aus dem er das Bild liest, aber gibt diesen nicht sofort wieder frei. :wall:
Da sie mal wieder(Wer erinnert sich an den schrecklichen ThreadPool in 1.1? :mrgreen: ) irgendeinen Praktikanten rangelassen haben , musst du natürlich selbst ran:
Code:
private void btnLoadImage_Click(object sender, EventArgs e)
{
  String basedir = FW.Instance.SysParams["Stammdaten.Pfade.Bilder"].Value;
  dlgOpenFile.InitialDirectory = basedir;

  if (dlgOpenFile.ShowDialog() == DialogResult.OK)
  {
    if(!Path.GetDirectoryName(dlgOpenFile.FileName) == basedir))
      someErrorProvider.SetError((Control)sender, "WTF willst du in dem Ordner?");

    edFilename.Text = Path.GetFileName(dlgOpenFile.FileName);
 
    using(Stream stream = dlgOpenFile.OpenFile())
      _image = new Bitmap(stream);

    btnPreview.Enabled = true;
  }
}
Aber mal ganz btw: War das jetzt nicht, öhm offensichtlich? Ich meine du hast mehrere Overloads des Konstruktors. Der mit dem Dateinamen ist Schrott, aber der mit dem Stream wäre doch gleich die nächste Adresse gewesen. ;)

Phoenix 30. Mai 2007 09:27

Re: Bild lesen blockiert Datei?
 
Ich hoffe, es war wenigstens eine hybsche Praktikantin. Zumindest die hier in Deutschland sind immer recht hybsch *g*

Naja, und wenn man den Stream dann noch closed, dann dürfte das auch wirklich so gehen. ;-)

Elvis 30. Mai 2007 09:30

Re: Bild lesen blockiert Datei?
 
Zitat:

Zitat von Phoenix
Ich hoffe, es war wenigstens eine hybsche Praktikantin. Zumindest die hier in Deutschland sind immer recht hybsch *g*

Bist du zum Jüdischen konvertiert? :mrgreen:

Zitat:

Naja, und wenn man den Stream dann noch closed, dann dürfte das auch wirklich so gehen. ;-)
Hallo? Wenn ich Dispose auf einen geöffneten Stream ausführe passiert was?
Mönsch Sebastian, du arbeitest doch nicht erst seit gestern mit .Net...

Phoenix 30. Mai 2007 09:33

Re: Bild lesen blockiert Datei?
 
Argl.. freilich..

Naja, ich arbeite nicht allzuviel mit using. Der implizite Dispose() - Aufruf war nicht so präsent wie er hätte sein sollen *g*

Aber was haben hybsche Mädels mit dem Jüdischen zu tun?

Elvis 30. Mai 2007 09:36

Re: Bild lesen blockiert Datei?
 
Zitat:

Naja, ich arbeite nicht allzuviel mit using.
Hatte ich fast befürchtet. Lass mich raten, du lässt deinen Code gerne in Finalizer rennen? ;)
Zitat:

Zitat von Phoenix
Aber was haben hybsche Mädels mit dem Jüdischen zu tun?

Hast du noch nie einen Mel Brooks Film gesehen? :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr.
Seite 1 von 2  1 2      

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