VB.Net-Forum - Beitragsübersicht -
ThemaSON: Object freigeben
Von Christian
E-Mail info@pol3cat.de
Datum 14. Mai 2019 um 07:37:30
Frage Hallo Zusammen,
ich kämpfe seit Tagen mit meiner Picturebox.
Ich kopiere Bilder in ein Arbeitspfad und lösche diese wieder wenn ich diese Bilder angezeigt habe.
Dann fängt alles wieder von vorne an.
Problem ist nur, dass ich DeleteFile nicht erneut aufrufen kann, da irgendwas mich blockt.
Habe versucht alle Verweise auf die Picturebox zu lösen, aber irgendwie komm ich so nicht weiter...

Vielleicht kann mir da jemand helfen. Danke
Private images_Screen As New List(Of Image)
Private index_Screen As Integer

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)

Do 'Until worker.CancellationPending = True

If worker.CancellationPending = True Then
e.Cancel = True
Exit Do
End If

' Lösche Bilder
Try
For Each foundFile As String In My.Computer.FileSystem.GetFiles(tempPfad_Screen, Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.jpg")
My.Computer.FileSystem.DeleteFile(foundFile)
Next
Catch ex As Exception
End Try

' Kopiere den Bildschirmschoner vom Copy In Temp
Try
For Each foundFile As String In My.Computer.FileSystem.GetFiles(Pfad_Copy_Screen, Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.jpg")
My.Computer.FileSystem.CopyFile(foundFile, tempPfad_Screen & "\" & My.Computer.FileSystem.GetName(foundFile), True)
Next
Catch ex As Exception
End Try

' Fülle Liste mit Bildern
Try
For Each Datei As String In My.Computer.FileSystem.GetFiles(tempPfad_Screen, FileIO.SearchOption.SearchTopLevelOnly, "*.jpg")
images_Screen.Add(Image.FromFile(Datei))
Next
Catch ex As Exception
End Try

' Zeige Lister der Bilder nach Zeit nacheinander an
Do Until index_Screen = images_Screen.Count
If images_Screen.Count > 0 Then
If index_Screen >= images_Screen.Count Then
index_Screen = 0
End If
worker.ReportProgress(100, "Nächstes Bild")
System.Threading.Thread.Sleep(Zeit_Bildschirmschoner)
pb_Screener.Image = Nothing
pb_Screener.Image = images_Screen(index_Screen)
index_Screen += 1
End If
Loop

'Aufräumen und Objecte frei geben
pb_Screener.Image = Nothing
images_Screen.Clear()
index_Screen = 0

'Beweg mal den Cursor, um Win-Bildschirmschoner nicht anzusprechen
Cursor.Position = New Point(nScreenWidth, nScreenHeight)

Loop

End Sub
Fehler bei execption bei DeleteFile
{System.IO.IOException: Der Prozess kann nicht auf die Datei "C:\temp\Bildschirmschoner\0000-PSA Erweiterung - Kopie (2).jpg" zugreifen, da sie von einem anderen Prozess verwendet wird.
bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
bei System.IO.File.InternalDelete(String path, Boolean checkHost)
bei System.IO.File.Delete(String path)
bei Microsoft.VisualBasic.FileIO.FileSystem.DeleteFileInternal(String file, UIOptionInternal showUI, RecycleOption recycle, UICancelOption onUserCancel)
bei Microsoft.VisualBasic.MyServices.FileSystemProxy.DeleteFile(String file)
bei WhiteBoard_Schlosserei.Whiteboard.BackgroundWorker1_DoWork(Object sender, DoWorkEventArgs e) In H:\NET Programmierung\WhiteBoard-Schlosserei\WhiteBoard-Schlosserei\Haupt.vb:Zeile 586.}
Antwort:
Von Nico
E-Mail nico.schertler@studentpartners.de
Datum 19. Mai 2019 um 03:25:41
Antwort Hi,

wenn du dir mal die Dokumentation zu Image.FromFile() ansiehst, wirst du dort sehen, dass die Datei gesperrt wird, solange das Image existiert. "Existieren" heißt dabei, dass das Objekt existiert. Es ist nicht ausreichend, wenn alle Referenzen auf das Objekt entfernt werden. Dann wird zwar früher oder später der Garbage Collector dafür sorgen, dass das Objekt aufgeräumt wird, aber wann das passiert, weiß nur der Garbage Collector. Stattdessen solltest du direkt .Dispose() aufrufen. Also:
For Each im In images_Screen
im.Dispose()
Next
image_Screen.Clear()
Ich vermute mal, dass das pb_Screener.Image auch in images_Screen enthalten ist. Ansonsten musst du dafür auch ein Dispose() aufrufen.

Nico
[ Antwort schreiben | Zurück zum VB.Net-Forum | Forum-Hilfe ]
Antworten
SON: Object freigeben - Christian 14. Mai 2019 um 07:37:30
Re: Object freigeben - Nico 19. Mai 2019 um 03:25:41
Re: Object freigeben - Christian 21. Mai 2019 um 07:15:30

Ihre Antwort
(Nick-)Name   Wichtige Informationen zur Namensangabe
E-Mail (opt.)  Wichtige Informationen zur Angabe einer eMail-Adresse
Thema   Wichtige Informationen zur Angabe eines Themas
Betrifft (IDE)  Sonstiges
Ihre Antwort
Smilies
Mehr...
FettKursivUnterstrichen   Übersicht der Tipp-KürzelÜbersicht der Projekt-KürzelÜbersicht der Bücher-Kürzel 
Homepage
Titel
Root-Smilies              
             
             
[ Zurück zum VB.Net-Forum | Forum-Archiv | Forum-Hilfe | Chat ]

Zum Seitenanfang

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB.Net | VB/VBA-Forum | DirectX | DirectX-Forum | Chat | Ausschreibungen | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Sonntag, 13. Dezember 2015