střídání vláken   zodpovězená otázka

VB.NET, Threading

Dobrý den,

potřebuju poradit s vlákny, mám UserControl a v něm funkci, která na Formu vyměňuje obsah PictureBoxů. Funkce si ze souboru načte o jaké PictureBoxy. Tuto funkci pustím a během toho ji potřebuji pustit znovu (i několikrát) souběžně s tou co již pracuje aby se měnily jiné pictureboxy, ale vždycky se mi ta první pozastaví a dokud ta nová neproběhne... A to já nepotřebuji. Potřebuji aby pracovali najednou.

Můžete mě někdo prosím vysvětlit a názorně ukázat jak na to?

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

Tak tohle půjde pomocí vláken velmi těžko. Radil bych vymyslet jiné řešení nebo použít WPF.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

já myslel že vlákna běží paralelně a tudíž by měli pracovat s formem najednou ale každé v jiném procesu

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

Všechna vlákna běží v rámci jednoho procesu. Mimo jiné bude problém se synchronizací. S ovládacími prvky z důvodu synchronizace nelze pracovat z jiného vlákna než z toho, ze kterého byly vytvořeny, tedy ve většině případů hlavní vlákno aplikace ve kterém běží smyčka zpráv. I kdyby byly nějaké výpočty prováděny ve vlastních vláknech, samotné nastavování vlastností by muselo být přehozeno do hlavního vlákna a tudíž i potom by docházelo k zamrzání uživatelského rozhraní (hlavní vlákno nestíhá).

Určitého výsledku by se dalo dosáhnout pomocí System.Windows.Forms.Timer, ale to rozhodně není ideální řešení.

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

Je tu několik problémů, které vycházejí z architektury, ale nejsou neřešitelné. A není nikterak složité.

Musíte si uvědomit následující fakta:

1. V aplikace bude existovat více vláken. Vždy máme jedno hlavní vlákno a jeho zdržení znamená zaseknutí aplikace.

2. Kód, který trvá dlouho je potřeba přesunout do jiného než hlavního vlákna.

3. Kód, který komunikuje s uživatelským prostředím (změna obrázku, změna textu v labelu atp.) je potřeba vykonat v hlavním vlákně. Použití vedlejšího vlákna bude znamenat pád vlákna.

Postup:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        Button1.IsEnabled = False
        Label1.Content = "Prosím čekejte..."

        ' uživatel vyvolal asynchronní operaci například klepnutím na tlačítko
        ' použijeme ThreadPool pro vyvolání operace v druhém vlákně
        System.Threading.ThreadPool.QueueUserWorkItem(AddressOf OperationWork)
    End Sub

    Sub OperationWork(ByVal parameter As Object)
        ' simulovat - dlouhá operace
        System.Threading.Thread.Sleep(2000)

        ' pomocí objektu Dispatcher vyvolat výsledek v hlavním vlákně
        Dispatcher.BeginInvoke(New Action(AddressOf OperationCompletedMainThread))
    End Sub

    Sub OperationCompletedMainThread()
        ' tato operace se provede v hlavním vlákně po dokončení dlouhé operace ve vedlejším vlákně
        Button1.IsEnabled = True
        Label1.Content = "Hotovo"
    End Sub

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

Ještě dodávám, že do OperationWork lze předat objekt pomocí parametru parameter, jenže předáte jako druhý parametr metodě QueueUserWorkItem. Jen si jej budete muset v asynchronní metodě přetypovat.

Naopak výsledek z asynchronní metody může předávat hodnoty do hlavního vlákna tak, že v Dispatcher.BeginInvoke předá místo jednoduché akce složitějšího delegáta, který bude nést i silně typové parametry.

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