Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Milan
Člen
Avatar
Milan:28.5.2019 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.5.2019 10:17
Avatar
zelvicek
Člen
Avatar
zelvicek:28.5.2019 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.5.2019 11:13
Avatar
Milan
Člen
Avatar
Odpovídá na zelvicek
Milan:28.5.2019 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.5.2019 13:24
Avatar
zelvicek
Člen
Avatar
zelvicek:28.5.2019 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.5.2019 14:31
Avatar
Milan
Člen
Avatar
Milan:28.5.2019 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.5.2019 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.