Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 3 odgovora
  • 2.614 pregleda

Najnovija ↓

BackgroundWorker C# 02.10.2008. u 18:11 · pre 220 meseci #1
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
Potpis
if(torrent == "free" && windows == true)
{
InstallOnComputer(Expensive_Software);
}
else goto Linux;
Re: BackgroundWorker C# 02.10.2008. u 18:28 · pre 220 meseci #2
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.
Re: BackgroundWorker C# 02.10.2008. u 18:35 · pre 220 meseci #3
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).
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: BackgroundWorker C# 03.10.2008. u 21:13 · pre 220 meseci #4
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 :)
Potpis
if(torrent == "free" && windows == true)
{
InstallOnComputer(Expensive_Software);
}
else goto Linux;
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme