Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

The calling thread cannot access this object because a diffrent thread owns it.

[es] :: .NET :: .NET Desktop razvoj :: The calling thread cannot access this object because a diffrent thread owns it.

[ Pregleda: 3024 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.static.sbb.rs.



+1 Profil

icon The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 15:21 - pre 146 meseci
Po pokretanju aplikacije otvara se jedan dijalog i na njemu se nalaze podesavanja koja uticu na rad aplikacije. Po zatvaranju dijaloga klikom na Button OK glavni dijalog dobija fokus. Kada dobije fokus kreira se novi Thread.

Npr...
Code:


private dllRtb dll = new dllRtb();   <-- Public promenljiva na nivou projekta, tj. forme u kojoj je kreirana

private void btnOk_Click(object sender, RoutedEventArgs e)
        {
            Thread aa = new Thread(StartRec);
            aa.Start();
        }

 void StartRec()
        {
            do
            {
                if (dll.Listen == true)
                {
                    dll.RegBol = true;
                    dll.FormatAnswerRtb(ref this.answerRtb,ref this.convRtb);  <--- ovaj red koda prijavi gresku 
                                                    (The calling thread cannot access this object  because a diffrent  thread owns it.)
                }
                else
                {
                    dll.RegBol = false;
                }
            }
            while (dll.AlowRtb == true);
        }


Promenljiva dll predstavlja referencu ka spoljnom fajlu (C# class library - DLL).
Zasto gresku nije prijavio u sledecem redu: dll.RegBol = true; ???



Funkcija dll.FormatAnswerRtb vrsi transformacije iz convRtb i vraca u answerRtb (answerRtb i convRtb su kontrole koje se nalaze na formi).

Na primer ako bi na nekoj formi imali dva textbox-a pozivom ove funkcije trebalo bi da se tekst iz prvog TextBox-a modifikuje i da se ucita u drugi TextBox. (namena moje funkcije je slicna samo ne radim sa TextBox kontrolama)

[Ovu poruku je menjao unisoft dana 24.03.2012. u 16:35 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 15:48 - pre 146 meseci
Pristupas kontroli iz drugog thread-a od onog u kojem je kreirana, sto nece moci direktno.
Imas na netu primer i za WinForms i za WPF kako da to uradis (prilicno je jednostavno, nekoliko linija je u pitanju, ali ne znam napamet da iskucam).
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.static.sbb.rs.



+1 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 16:00 - pre 146 meseci
Citat:

Pristupas kontroli iz drugog thread-a od onog u kojem je kreirana, sto nece moci direktno.


Da, 100% si u pravu samo ne znam kako da otklonim gresku :(.

Pokusao sam sa vise primera koje sam pronalazio na netu i nije mi uspelo da resim problem (gresku vise ne prijavljuje ali vraca prazan string u drugu kontrolu, a ne modifikovan).

Moze link od sajta na kome je resenje za problem, pls.
 
Odgovor na temu

plague
Software Developer
Auckland, NZ

Član broj: 46734
Poruke: 623
*.aDSL.verat.net.



+373 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 16:14 - pre 146 meseci
Provaj ovo:
Code (csharp):

if (dll.InvokeRequired)
{
          dll.Invoke(new MethodInvoker(delegate { dll.FormatAnswerRtb(ref this.answerRtb,ref this.convRtb); }));
}
 


Edit:
Mozda sam se zeznuo i nisam razumeo lepo sta prouzrokuje Exception, ali ovo ti je forma.
Code (csharp):

if (/*ime kontrole*/.InvokeRequired)
{
          /*ime kontrole*/.Invoke(new MethodInvoker(delegate { /*posao koji treba da odradi*/ }));
}
 
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.static.sbb.rs.



+1 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 16:24 - pre 146 meseci
zaboravio sam da napomenem da radim u C# WPF-u.

Kada otkucam ime kontrole IntelliSense ne izbacuje InvokeRequired, a ni za dll IntelliSense ne izbacuje InvokeRequired.
 
Odgovor na temu

plague
Software Developer
Auckland, NZ

Član broj: 46734
Poruke: 623
*.aDSL.verat.net.



+373 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 16:38 - pre 146 meseci
Citat:
Funkcija dll.FormatAnswerRtb vrsi transformacije iz convRtb i vraca u answerRtb (answerRtb i convRtb su kontrole koje se nalaze na formi).

Moguce je da pristupom answerRtb i convRtb dobijas exception, zapravo vrlo moguce. Ako je to, i obe kontrole traze invoke ne znam da li ce biti moguce(ili uopste biti potrebno) da unutar jednog delegate {} ponovo pozoves za drugu.

P.S. Ne razumem se previse u ovo, imao sam problem slican tvom u WinForms i nasao ovakvo resenje koje mi je radilo.
 
Odgovor na temu

marko1981
Marko Nikolic
Beograd

Član broj: 123059
Poruke: 144
*.ptt.rs.



Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 16:42 - pre 146 meseci
WPF equivalent of InvokeRequired
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 18:04 - pre 146 meseci
Ono sto je plague predlozio ali to uradis unutar dll-a, tamo gde pristupas kontroli. Samo zameni dll.invoke sa imenom promenljive za tu kontrolu.
Dakle.. if (kontrola.InvokeRequired) { kontrole.Invoke(...); }
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.static.sbb.rs.



+1 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 18:25 - pre 146 meseci
Citat:

Ono sto je plague predlozio ali to uradis unutar dll-a, tamo gde pristupas kontroli. Samo zameni dll.invoke sa imenom promenljive za tu kontrolu.
Dakle.. if (kontrola.InvokeRequired) { kontrole.Invoke(...); }


Shadowed to sam i pokusao da uradim ali u IntelliSense listi nemam InvokeRequired, a ni Invoke.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 19:38 - pre 146 meseci
E, sorry, to je za WinForms. Ista stvar za wpf ono sto je na Markovom linku - u dll-u stavi taj deo if (kontrola.Dispatcher.CheckAccess()) { //Do What you need } else { kontrola.Dispatcher.Invoke(...); }
Sorry sto pisem ovako u jednoj liniji ali ne da mi se prelamati a ima na linku vec formatiran primer :)
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 20:17 - pre 146 meseci
Citat:

E, sorry, to je za WinForms. Ista stvar za wpf ono sto je na Markovom linku - u dll-u stavi taj deo if (kontrola.Dispatcher.CheckAccess()) { //Do What you need } else { kontrola.Dispatcher.Invoke(...); }


IntelliSense ne prikazuje ni .Dispatcher.CheckAccess() (radim sa WPF richtextbox kontrolom).
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 21:29 - pre 146 meseci
Jesi li cast-ovao promenljivu? Mora imati taj property jer nasledjuje od DispatcherObject-a http://msdn.microsoft.com/en-u...dows.controls.richtextbox.aspx
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.static.sbb.rs.



+1 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 22:11 - pre 146 meseci
Sve je okee. Pronasao sam na jednom forumu clanak o Dispatcher.CheckAccess i pise da je to bag i da ce biti ispravljeno. Ne pojavljuje se u IntelliSense listi Dispatcher.CheckAccess() ali je tu :).
Citat:

if (kontrola.Dispatcher.CheckAccess())
{ //Do What you need }
else
{
kontrola.Dispatcher.Invoke(...);
}


Sta treba da napisem umesto ... (treba li celu funkciju da dupliram - jedna u true deo, a druga u false deo kontrola.Dispatcher.Invoke(...))??
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.24.03.2012. u 23:47 - pre 146 meseci
Jedan nacin je onako kao sto je prikazano na linku. Dakle:
Code:

private delegate void TextChanger();

private void ChangeTextProperly()
{
    if (this.txtMain.Dispatcher.CheckAccess())
    {
        this.txtMain.Text = "Hello World";
    }
    else
    {
        this.txtMain.Dispatcher.Invoke(
            System.Windows.Threading.DispatcherPriority.Normal,
            new TextChanger(this.ChangeTextProperly));
    }
}


Dakle, poenta je da pozoves istu funkciju rekurzivno (s tim da je nivo rekurzije 1) samo ovog puta preko Dispatcher-a. Kad udje u tu funkciju po drugi put if uslov ce biti ispunjen. Delegat sluzi samo da bi mogao da prosledis funkciju kao parametar.


Drugi nacin je zapravo vrlo slican. Ukoliko u funkciji radis neki obimniji posao, nema smisla prebacivati izvrsavanje na GUI thread (verovatno si zato i radio u posebnom). Ona izdvojis taj update gui-a u jednu zasebnu funkciju i u nju stavis taj if kao u gornjem kodu.
Nesto ovako:
Code:

Public void SomeFunction()
{
    //Havy work
    ChangeTextProperty();
}



Dakle, glavni posao se obradjuje a tek kad zavrsi pozivas update funkciju koja ce se re-pozvati ukoliko nije na gui thread-u (a nije). Nadam se da nisam previse zakomplikovao
 
Odgovor na temu

Dusan Kondic
Programer
ZR "Parametar" Ljubovija
Ljubovija

Član broj: 49961
Poruke: 225
*.adsl-a-2.sezampro.rs.

Sajt: www.drinacoding.com


+14 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.25.03.2012. u 11:21 - pre 146 meseci
Ako se metoda uvek okida iz drugog thread-a (npr. kod komunikacije sa eksternim uređajima) onda ne moramo da proveravamo CheckAccess() nego odmah izvršavamo kod pozivajući ga iz osnovnog thread-a:
Code:

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
txtMain.Text = "Hello World";
}));

Ovo je u stvari samo malo kraće napisano rešenje koje je dao Shadowed pod (1).
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.static.sbb.rs.



+1 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.27.03.2012. u 14:49 - pre 146 meseci
Jos uvek nisam uspeo da postignem ono sto sam postavio kao krajnji cilj ali malim koracima priblizavamo se clju :).

Code:

        public delegate void delSp();

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Thread ss = new Thread(TrdRun);
            ss.Start();
        }

        private void TrdRun()
        {
            if (this.conRichTextBox.Dispatcher.CheckAccess())
            {
                BackSp();
            }
            else
            {
                this.conRichTextBox.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new delSp(this.TrdRun));
            }
        }

        private void BackSp()
        {
            do
            {
                sttSp.Start();   <-- Metoda Start iz moje klase. Ona formatira string koji je prethodnim akcijama napunjen CHAR podacima
                dllFormat.ConverRtb(ref conRichTextBox, sttSp.ReturnList()); sttSp.ReturnList() --> Vraca string
            }
            while (sttSpe._bolReady == true);
        }


opet ja sa istim problemom. Pogledao sam vase kodove ali nije mi uspelo. Gore navedeni kod radi dobro ali problem je u tome sto mi zamrzne ekran, zamrzne interfejs aplikacije zbog petlje do while (barem ja tako mislim).

Meni se cini kao da ne kreira novi tread.

Code:

do
            {
                sttSp.Start();   <-- Metoda Start iz moje klase. Ona formatira string koji je prethodnim akcijama napunjen CHAR podacima
                dllFormat.ConverRtb(ref conRichTextBox, sttSp.ReturnList());  sttSp.ReturnList() --> Vraca string
            }
            while (sttSpe._bolReady == true);


Potrebno mi je da se u pozadini izvrsava ovaj kod sve vreme, dok se akcijom korisnika to ne prekine. Kada se otvori forma korisnik prvo klikne na jedan Button koji prikaze formu sa podesavanjima . Na formi sa podesavanjima nalazi se jedan CHECK Box. Klikom na button OK ove forme ako je oznacen CHECK BOX promenljiva (sttSpe._bolReady) == true postavlja se na TRUE i ova forma se zatvara.

Kada se forma zatvori, fokus dobija glavna forma sa koje smo i pokrenuli formu sa podesavanjima. Na ovoj formi nalazi se jos jedan Button na koji kada kliknemo treba da se izvrsava gornji kod sve dok korisnik ponovo ne klikne na Button koji otvara formu sa podesavanja i NE SKINE OZNAKU SA CHECK BOX-a i to potvrdi klikom na Button OK te forme.

Dakle problem je u tome sto se interfejs zamrzne i korisnik ne moze ponovo da klikne na dugme koje otvara formu sa podesavanjima i da tako sto SKINE OZNAKU iz CheckBox-a sto potvrdjuje klikom na Button OK te forme. Kada klikne na OK te forme, ako je uklonio oznaku sa checkbox Button-a promenljiva (sttSpe._bolReady == false) se postavlja na FALSE.

Ovu promenu registruje Do while petlja (u pozadini se izvrsava i stalno proverava promenljivu sttSpe._bolReady) i ako je sttSpe._bolReady == false treba da se zaustavi Thread.

Napomena: vise ne dobijam poruku (Exception iz VS - The calling thread cannot access this object because a diffrent thread owns it.) da je metoda pozvana iz drugog Thread-a. Sve dobro radi, osim sto mi se zamrzne interfejs aplikacije :(.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.27.03.2012. u 15:13 - pre 146 meseci
Sta imas u dllFormat.ConverRtb?
Koliko mogu da zakljucim on unutra nesto radi sa RichTextBox-om. Sve te peripetije sa prebacivanjem na dispatcher bi trebalo da podesis tek tamo gde neposredno nesto radis sa kontrolom.
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.static.sbb.rs.



+1 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.27.03.2012. u 15:29 - pre 146 meseci
dllFormat.ConverRtb radi sledece:

Ulaz:
1. ref RichTextBox
2. string

Radi:
1. cita tekst iz RichTextBox kontrole. Ovaj tekst nije obican vec je u Rtf formatu.
2. Cita formatiranje zadnje linje teksta u RichTextBox kontroli (boja, font, velicina)
3. prosledjeni tekst formatira prema koraku 2
4. sve sastavlja u jednoj promenljivoj string. Na pocetak ide prethodni sadrzaj, a na kraj u novom redu prosledjeni tekst
5. RichTextBox kontrola se prazni, brise se sav sadrzaj i ucitava novi.


Ako imas vremena mozes li da mi napravis projekat u VS C# sa brojevima (npr. ili nesto prostije ako se setis). Glavni tred stampa brojeve od 1 do 50 u TextBox koji se nalazi na formi sa koje se pokrece, a kada se klikne na Button koji se nalazi na istoj formi treba da se pokrene petlja koja stampa brojeve od 50 do 100 u isti textbox. (brojeve treba da dodaje i glavni i pozadinski tread u isti TextBox).

Na netu ima dosta primera na ovu temu ali svi ti primeri koje sam pronasao rade sa STATIC metodama, a meni treba suprotno.

[Ovu poruku je menjao unisoft dana 27.03.2012. u 16:40 GMT+1]
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
*.static.sbb.rs.



+1 Profil

icon Re: The calling thread cannot access this object because a diffrent thread owns it.27.03.2012. u 22:10 - pre 146 meseci
RESENO !!!

Hvala svima na pomoci. Bio sam u corsokaku ali vi ste me usmerili u kom pravcu treba da istrazujem i sada sam dosao do resenja. Bilo je potrebno samo pozvati Dispatch.Invoke metod kontrole :)...
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: The calling thread cannot access this object because a diffrent thread owns it.

[ Pregleda: 3024 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.