Geek tričko zdarma Geek tričko zdarma
Hledáme grafika na pohodovou brigádu v Blenderu nebo programátora na hry v PyGame. Máš zájem? Napiš nám na redakce [zavináč] itnetwork.cz!
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

Diskuze: Práce s vlákny

Aktivity (4)
Avatar
Milan
Člen
Avatar
Milan:28. května 10:17

Ahoj, potřeboval bych poradit s Threadem. Mám udělanou třídu, která mi výsledek různých metod zapisuje do Gridu. Pokud pracuji v hlavním vlákně, tak vše mi zapíše správně. Jakmile si pro ní vytvořím thread, tak to sice zpracuje (asi) ale do gridu nic nevypíše. datasndf.dataSDNF vypadá že normálně funguje, protože skrze ní i zapisuji do .txt pro kontrolu a tam hodnoty zapsané jsou.

private void ConvertSNDFFile_Button_Click(object sender, RoutedEventArgs e)
        {
            if (SDNF_2k14_radiobtn.IsChecked == true)
            {
                Thread workthread = new Thread(Compare);
                workthread.Start();
            }
            else if (SDNF_2k18_radiobtn.IsChecked == true)
            {
                MessageBox.Show("Zatím neumím :-(");
            }
        }

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

Zkusil jsem: Nevím jak správně pracovat s vlákny. :-/ Pročetl jsem nějaké tutoriály, ale nejsem z toho moc moudrý, potřeboval bych to asi vysvětlit více polopatě.

Chci docílit: V podstatě získat výsledky z pracovního vlákna do gridu. Dále nevím jak jak získat hodnoty pro progress bar, který bych potřeboval aktualizovat podle toho jak datasndf.dataSDNF postupuje. Jelikož vždy se mi grid aktualizuje rovnou (jakmile datasndf.dataSDNF dodělá co má, tzn. se mi vypíšou hned všechny výsledky najednou a ne postupně) v hlavním vlákně, nebo vůbec pokud to mám v threadu. Doufám, že jsem to popsal srozumitelně a budu rád za rady. Díky moc!

 
Odpovědět 28. května 10:17
Avatar
zelvicek
Člen
Avatar
zelvicek:28. května 11:13

Buďto pomocí Delegate.Dyna­micInvoke()
https://docs.microsoft.com/…ynamicinvoke

nebo Synchronizati­onContext
https://docs.microsoft.com/…ationcontext
https://www.codeproject.com/…indows-Forms

 
Nahoru Odpovědět 28. května 11:13
Avatar
Milan
Člen
Avatar
Odpovídá na zelvicek
Milan:28. května 13:24

Zkusil jsem získat hodnoty přes Synchronizati­onContext, ale stejně mi to hází nuly....

private void ConvertSNDFFile_Button_Click(object sender, RoutedEventArgs e)
       {
           if (SDNF_2k14_radiobtn.IsChecked == true)
           {
               _synchronizationContext = SynchronizationContext.Current;
               _threadStart = new ThreadStart(Compare);
               _thread = new Thread(_threadStart);
               _thread.Start();
               _synchronizationContext.Post((o) =>
               {
                   datasndf.numberOfProfiles = x;
               }
               , null);
           }
           else if (SDNF_2k18_radiobtn.IsChecked == true)
           {
               MessageBox.Show("Zatím neumím :-(");
           }
       }

       private void Compare()
       {
           BackgroundWorker worker = new BackgroundWorker();
           worker.WorkerReportsProgress = true;
           worker.DoWork += worker_DoWork;
           worker.ProgressChanged += worker_ProgressChanged;

           worker.RunWorkerAsync();

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

           MessageBox.Show(i.ToString() + x.ToString());
       }

       void worker_DoWork(object sender, DoWorkEventArgs e)
       {
           for (int j = 0; j < x; j++)
           {
               _synchronizationContext.Post((o) =>
               {
                   datasndf.updateProgressBar = i;
               }
               , null);
               (sender as BackgroundWorker).ReportProgress(i);
               Thread.Sleep(10);
           }
       }

       void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
       {
           progressBar.Value = e.ProgressPercentage;
       }

Pokusil jsem se updatovat hodnoty pro progress bar, ale když si vypíšu hodnoty i a x co by mi měl házet Synchronizati­onContext, tak v message boxu mám 0. Ty samé hodnoty si vypisuju přímo v tříde DataSNDF do .txt a tam mám hodnoty.

 
Nahoru Odpovědět 28. května 13:24
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
zelvicek
Člen
Avatar
zelvicek:28. května 14:31

Netuším, co ti na tom nefunguje.

Zde je funkční příklad formu:

public partial class FormMain : Form
{
        Label _label;
        public FormMain()
        {
                InitializeComponent();
                this.Controls.Add(_label=new Label() { Top=30 });

                Button buttonTest;
                this.Controls.Add(buttonTest=new Button { Text="Test" });
                buttonTest.Click+=buttonTest_Click;
        }

        private void buttonTest_Click(object sender, EventArgs e)
        {
                SynchronizationContext synchronizationContext=SynchronizationContext.Current;
                new Thread(()=> { Thread.Sleep(2000); synchronizationContext.Post(scCtx => _label.Text=((DateTime)scCtx).TimeOfDay.ToString(),DateTime.Now); }).Start();
        }
}

A tímto bych diskuzi uzavřel.

 
Nahoru Odpovědět 28. května 14:31
Avatar
Milan
Člen
Avatar
Milan:28. května 18:06

Pochopil jsem jak dostat hodnotu z pracovního threadu. Ale nevím / nechápu, jak aktualizovat progress bar, nebo zapisovat hodnoty do gridu z běžícího threadu. To musím udělat pro vše zvláštní thread?

 
Nahoru Odpovědět 28. května 18:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.