Zapisování do Gridu z vlákna – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zapisování do Gridu z vlákna – .NET – Fórum – Programujte.comZapisování do Gridu z vlákna – .NET – Fórum – Programujte.com

 

ORION
~ Anonymní uživatel
2 příspěvky
31. 5. 2019   #1
-
0
-

Ahoj,

potřeboval bych poradit s zapisováním dat, které dostávám z jiného threadu. Pročítám si tutoriály o vláknech, ale prostě nejsem z toho moudrý. :-/ Mám v jiné třídě metodu pro zápis do gridu a v hlavním vlákně vše funguje (respektive se vše zapíše až práce celé třídy skončí). Ale jakmile to dám do threadu, tak mi to do Gridu nezapisuje.

Chápu, že musím asi přes Invoke, nebo synchonizatin context, dostat data a zároveň mi asi musí běžet druhý thread pro grid? Ale prostě nevím jak to udělat. Poradil by mi někdo prosím? nechápu jak synchronizovat práci více vláken, které jsou závislé na aktualizaci dat z jednoho threadu.

Mám okno 

private void ConvertSNDFFile_Button_Click(object sender, RoutedEventArgs e)
        {
            if (SDNF_2k14_checkBox.IsChecked == true)
            {
                _synchronizationContext = SynchronizationContext.Current;
                _threadStart = new ThreadStart(Compare);
                _thread = new Thread(_threadStart);
                _thread.Start();
            }
            else if (SDNF_2k18_CheckBox.IsChecked == true)
            {                
                MessageBox.Show("Zatím neumím :-(");
            }
}


private void Compare()
        {
            Stopwatch stw = Stopwatch.StartNew();
            ReadWriteFile_WND rwf = new ReadWriteFile_WND(datasndf.dataSDNF, PathSDNFFile, NameSDNFFile, frequency, PathPointCloudFile, successRate, interval, Results, numberOfCheks, HalfLength, OneThirdOfTheLength);            
            stw.Stop();
            MessageBox.Show(stw.Elapsed.TotalSeconds.ToString());
        }

Pak classu pro zápis do gridu 

 class DataGridWrite
    {
        public string Name { get; set; }
        public string Result { get; set; }

        
        public void WriteToGrid(string Name, string result , DataGrid resultsGrid)
        {
            var results = new DataGridWrite
            {
                Name = Name,
                Result = result

            };

            resultsGrid.Items.Add(results);
        }
    }

WriteToGrid volám přímo ve třídě kterou spouští Compare(). Což je teda blbě.

Představoval bych si, že vždy po aktualizaci všech dat, které chci mít v gridu, se mi prostě zapíše nový řádek. A z toho poznám postup kodu. Tak samo bych rád udělal i progressbar, ale problém je v podstatě stejný, nevím jak na to. :-/ Díky moc za radu.

Nahlásit jako SPAM
IP: 91.139.6.–
gna
~ Anonymní uživatel
1847 příspěvků
31. 5. 2019   #2
-
0
-

Obecně když běží více vláken, tak je potřeba je synchronizovat tak, aby si navzájem neměnila data "pod rukama".

Když chceš z vlákna přistupovat k UI, které je spravováno v jiném vlákně, tak se dá použít právě Control.Invoke, které spustí funkci ve vlákně UI (resp. obecně ve vlákně okna, kterému ta kontrolka patří). A v té funkci (delegátovi) pak normálně uděláš, co potřebuješ.

Před pár dny tady byl dotaz na BackgroundWorker s Gridem. Nebylo to od tebe? Jak tam hlucheucho zmínil, tak BackgroundWorker.ReportProgress ti umožní přesně to samé. Tou dvouparametrovou verzí můžeš "poslat" int a libovolný objekt a v handleru ProgressChanged, který běží v hlavním vlákně, pak ta data můžeš šoupnout do UI.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý