[ IQooLogic @ 02.10.2008. 17:11 ] @
Hteo sam da napishem app koja cje da koristi BackgroundWorker i ponadao se da cje to da bude lakshe nego pisati multithread program.Program radi ono shto treba, nemam problema sa greshkama tipa
Citat:
Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.

Sve radi kako treba ali program se ponasha kao da nije multithread i ako u pozadini navodno radi BackgroundWorker.



Code:

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            button1.Text = "Code Text";
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            button1.Text = "DeCode Text";
        }

        delegate void DoIt();

        public void Work()
        {
            if (!richTextBox1.InvokeRequired)
            {
                Form1.ActiveForm.Text += " Working please wait ...";
                string str = richTextBox1.Text;
                richTextBox1.Text = "";
                CharEnumerator enu = str.GetEnumerator();
                while (enu.MoveNext())
                {
                    if (radioButton1.Checked)
                    {
                        int c = (int)enu.Current + 13;
                        richTextBox1.Text += String.Concat(Convert.ToChar(c));
                        richTextBox1.Refresh();
                        //richTextBox1.ScrollToCaret();
                    }
                    else if (radioButton2.Checked)
                    {
                        int c = (int)enu.Current - 13;
                        richTextBox1.Text += String.Concat(Convert.ToChar(c));
                        richTextBox1.Refresh();
                        //richTextBox1.ScrollToCaret();
                    }
                }
            }
            else
            {
                Invoke(new DoIt(Work));
            }
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            Work();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Form1.ActiveForm.Text = "Enc13";
            MessageBox.Show("Work completed !", "Enc13");
        }


Evo ga kod pa vidite ako shta nije u redu i gde greshim.Da pojasnim josh jednom, sve shto hocju je da kada recimo procesuira dug tekst da mogu program nesmetano da pomeram i da klikcjem dugmicje, shto u ovom gore kodu ne mogu Pomagajte
[ DarkMan @ 02.10.2008. 17:28 ] @
Ako hoces da ti aplikacija reaguje na dogadjaje dok se neka zahtevna operacija odvija moras iz te operacije povremeno pozvati Application.DoEvents(). U tvom slucaju dodaj na kraju while petlje.
Pozivanje DoEvents metode usporava tvoju operaciju ali zato omogucava normalno odvojanje dogadjaja. Ako zelis da minimiziras usporenje pozivaj DoEvents, na primer, u svakom 10-tom prolazu petlje.
[ mmix @ 02.10.2008. 17:35 ] @
Pa ne radi ti kako hoces iz prostog razloga sto ti worker thread ni ne odradjuje cnode/decode posao. Kad thread udje u Work metod, prva provera (!richTextBox1.InvokeRequired) ce biti false, sto ce UVEK izazvati poziv Invoke(new DoIt(Work)); sto ce onda procesiranje Work metoda vratiti nazad u UI thread.

Mozda ti je bolje da primenis resenje koje ti Darkman predlozio nego da se zezas sa threadovima (pod uslovom da ti je jedini cilj to sto si naveo).
[ IQooLogic @ 03.10.2008. 20:13 ] @
Hvala za odgovor i da radi to shto sam zamislio sa DoEvents ali ipak mi je glavni cilj bio da se to reshi preko thread-a