Změna image na PictureBoxu   zodpovězená otázka

VB.NET, WinForms, I/O operace

Zdavím, dostal jsem se se do slepé uličky, zkoušel jsem FileWatcher a jeho úkol je zobrazit každý nový jpg v adresáři, který hlídá. Pokud nastane event vložení souboru, běží v jiném vlákně a proto používám invoke. První vložený obrázek OK, další K.O. s chybou nedostatek paměti ?! Souvísí to s Invoke, protože pokud bych měnil obrázky tlačítkem na formu, vše OK.

    Private Sub FotoWatcher_Created(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FotoWatcher.Created

        If Path.GetExtension(e.Name).ToUpper = ".JPG" Then

             ShowPic(Bitmap.FromFile(e.FullPath))

        End If

    End Sub

    Delegate Sub SavePicDelegate(ByVal Pic As Bitmap)

    Protected Sub ShowPic(ByVal Pic As Bitmap)

        If Me.InvokeRequired Then
           Me.Invoke(New SavePicDelegate(AddressOf ShowPic), Pic)
           Exit Sub
        End If

        PictureBox1.Image = Pic

    End Sub

Díky za pomoc

J.

P.S. zkoušel jsem předávat jen cestu jako string se stejným výsledkem

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Blbost je to, že používáte Invoke. Komponenta FileSystemWatcher stejně jako všechny ostatní Windows Forms komponenty (Timer, BackgroundWorker, ...) má už synchronizaci zabudovanou v sobě.

Vyhoďte to a uvidíte, že to začne fungovat podle očekávání (pokud tedy používáte tu vizuální komponentu FileSystemWatcher).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak jsem to zkusil, nepadá to, ale chová se to vlastně stejně, první obrázek ano, další jen problikne na PictureBoxu InitialImage a pak zůstane ErrorImage. Vedle na Formu je Label, kam zapisuju cestu k souboru a ten funguje jak má, s každým dalším souborem vloženým do sledovaného adresáře vypíše jeho cestu.

    Private Sub FileSystemWatcher1_Created(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Created

        PictureBox1.ImageLocation = e.FullPath
        Label1.Text = e.FullPath

    End Sub

V principu to ani nepoužiju, protože cíl je primitivní služba, která bude hlídat složku kam se přidávají obrázky. Pokud bude nový soubor, změni rozlišení, přejmenuje a uloží na jinam, to je bez problému. Jen jsem si to chtěl odladit na Formu, vidět co to dělá a jako na potvoru jsem se na tom pěkně kousnul :-)

J.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Obrázek PictureBoxu nastavujte pomocí:

PictureBox1.Image = New Bitmap("C:\Obrázek.jpg")

A nepleťte do toho žádné InitialImage nebo ErrorImage, když nejspíš ani nevíte, k čemu to je (podobně jako Invoke u FileSystemWatcheru).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nepletu, jen jsem chtěl naznačit , že obrázek se má snahu naládovat, ale nepovede se to ...

jinak pokud nastavuji obrázek do PictureBoxu takto (v eventu FileWatcheru) výsledek je tento: "Exception has been thrown by the target of an invocation." :-(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte to prostě něčím zabordelené už z dřívější doby. Vytvořte si nový testovací projekt, vložte do něj PictureBox (nenastavujte mu žádné vlastnosti!) a FileSystemWatcher a doplňte jen mnou uváděný kód do události FileSystemWatcheru.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi bych to uzavřel, že na VS2008 mám smůlu z nějakého "vyššího" důvodu. Našel jsem

http://www.youtube.com/watch?v=j2R4lGPjE...

což je na chlup stejné (ale verze 2010), co jsme chtěl napsat. Pokud ten kod použiju v mém prostředí (v prázdném projektu) stejně mi to zobrazí jen první obrázek. různé způsoby vložení bitmapy do PictureBoxu jen ovlivňují, jestli nastane vyjímka nebo ne.

Rozdíl v tom, že v příkladu se deklaruje FileWatcher v kodu a nepřetahuje se z Toolboxu je asi nepodstatný ...

J.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

!!!

tak ne , rozběhal jsem to, jen jsem se zaseknul na používání eventu "created" s eventem "changed" to dělá co má ...

Ono je to tak, že : "The OnCreated event is raised as soon as a file is created. If a file is being copied or transferred into a watched directory, the OnCreated event will be raised immediately, followed by one or more OnChanged events."

takže pro zobrazování (načítaní) souborů se event created nehodí, protože když nastane, soubor se může ještě nějakou chvíli kopírovat ...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback