backgroundworker i invoke C++/Cli

0

Witam wszystkich,
trochę poczytałem ale nadal nie mogę rozwiązać mojego problemu :/
Jest to moja pierwsza aplikacja wielowątkowa.
Mianowicie
testowałem to pod guzikiem button i wszystko OK, problem pojawia się gdy włożyłem całość do backgroundworker.

konkretnie chodzi o tą jedną linię:

rtb= dynamic_cast<RichTextBox^>(tabControl1->TabPages[i]->Controls["RTB"+tabControl1->TabPages[i]]);
 

komunikat:
"Nieprawidłowa operacja miedzy wątkami: do formantu "RTBTabPage:{ewr}" uzyskiwany jest dostęp z wątku innego niż wątek, w którym został utworzony."

Z forum wyczytałem o użyciu invoke ale tu coś robię już źle:/

Opcja 1.
W programie głównym:

			delegate void watekd(int xx);
			void watekx (int xx)
	{
		Invoke(gcnew watekd(&Client::Form1::watekx), xx);
		tabControl1->TabPages[xx]->Controls["RTB"+tabControl1->TabPages[xx]];
	}
 

W wątku nawet nie zabrałem się za wywoływanie delegata jeżeli tu "klapa":/

Opcja 2.
W wątku:

Invoke(rtb= dynamic_cast<RichTextBox^>(tabControl1->TabPages[i]->Controls["RTB"+tabControl1->TabPages[i]]));
 
0

Nie sprawdzane:

delegate void watekd(int xx);
void watekx (int xx)
{
    if (tabControl1->InvokeRequired())
        Invoke(gcnew watekd(&Client::Form1::watekx), xx);
    else
        tabControl1->TabPages[xx]->Controls["RTB"+tabControl1->TabPages[xx]];
}

za pierwszym wejściem, InvokeRequired jest true i wykona się Invoke. które odpali tę samą funkcję jeszcze raz, ale tym razem InvokeRequired będzie już false i wykona się kod po else.

u ciebie funkcja wywołuje się rekurencyjnie bez końca, co musi się skończyć przepełnieniem stosu.

0

Dzięki za kod, sprawdzę go jak wrócę do domu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1