wątki i tworzenie nowych komponentów

0

Piszę aplikację, w ironpythonie, czyli w .net za pomocą pythona. Aplikacja składa się z gui, wątku pośredniczącego, który pośredniczy między gui i kilkoma wątkami obsługującymi część sieciową programu.
Trafiłem na problem, z którym nijak nie potrafię sobie poradzić, otóż gdy zajdzie jakieś zdarzenie w wątkach obsługujących sieć informują one poprzez wątek pośredniczący gui, że zaszło takie a takie zdarzenie i gui ma utworzyć wtedy nowy komponent i umieścić go na odpowiednim panelu. I tutaj tkwi mój problem. W momencie, kiedy próbuję utworzyć taki komponent pojawiają się 2 rodzaje wyjątków o treści:
"Formanty utworzone w jednym wątku nie mogą być nadrzędne w stosunku formantów w innym wątku"
lub
"Nie można utworzyć wystąpienia formantu Acitve-X ponieważ wątek nie pracuje w apartamencie jednowątkowym"
Próbowałem już na kilkanaście sposobów to rozwiązać, ale niestety mi się nie udało.
Jeżeli ktoś ma pojęcie jak sobie z tym poradzić to proszę o pomoc ponieważ termin oddania projektu się zbliża, a ja nie dalej tkwię w martwym punkcie... :(

0

Nigdy nie pisałem nic w ironpythonie więc moja odpowiedź może nie być do końca prawdziwa.
Ogólnie nie lubię spolszczania komunikatów, bo to trochę poroniony pomysł ale co tam.
Wydaje mi się że ten drugi wyjątek: "Nie można utworzyć wystąpienia formantu Acitve-X ponieważ wątek nie pracuje w apartamencie jednowątkowym" jest spowodowany tym że nad metodą znajduje się atrybut:
[MTAThread]
a powinien[STAThread]
Co do pierwszego to okropnie namieszałeś z tymi wątkami.
Komunikat: "Formanty utworzone w jednym wątku nie mogą być nadrzędne w stosunku formantów w innym wątku" - genialne tłumaczenie :/
Wszystkie formy, oraz kontrolki powinny być tworzone w jednym wątku. Nie możesz nic z GUI stworzyć w oddzielnym wątku. Poszukaj rozwiązań używając Invoke lub przesyłaj komunikaty do GUI w obsłudze których możesz już tworzyć co tam chcesz.

Mam nadzieje że Cię choć trochę naprowadzi na rozwiązanie.

0

Z tymi tłumaczeniami wyjątków to też nie wiem po co to jest tylko utrudnia to sprawę.
Jeżeli chodzi o Invoke to sporo o tym czytałem, ale niestety delegaty albo nie działają w IronPythonie albo ja nie umiem ich prawidłowo tworzyć, ale naprawdę nasiedziałem się już nad tym sporo i wydaje mi się, że nie da się ich użyć. :/
Jeżeli chodzi o przesyłanie komunikatów do gui to już tak próbowałem, np przez kolejkowanie komunikatów, obsługę kolejkowania przez BackgroundWorkera, oprogramowanie RunWorkerCompleted i kilka innych podobnych metod i zawsze to samo.
Przed chwilą jeszcze zauważyłem, że ten komunikat "Formanty utworzone w jednym wątku nie mogą być nadrzędne w stosunku formantów w innym wątku" pojawia się w nie w momencie tworzenia kontrolki, tylko po jej utworzeniu, kiedy ją dodaję do formatki (wywołuję form.Controls.Append(nowa kontrolka))

Mam jeszcze inny pomysł, tylko nie wiem czy wykonalny, bo nie wiem czy można wywołać jakieś zdarzenie ręcznie? Np zdarzenie Click przypisane do jakiegoś buttona? Chodzi mi o takie jakby zasymulowanie wciśnięcia buttona, bo jeżeliby się dało, to można by było wywołać takie zdarzenie, a w gui zrobić przycisk i jego zdarzenie click opogramować metodą, która tworzy nowy komponent. Może coś takiego by zadziałało...

0

Po co tak naokoło możesz pewnie dziedziczyć po BackgroundWorker-rze i rozszerzyć jego funkcjonalność.
Kod napisany w C#:

 
    public delegate void CreateControlHandler();

    public class Worker : BackgroundWorker
    {
        public event CreateControlHandler CreateControl;

        protected override void OnDoWork(DoWorkEventArgs e)
        {
            base.OnDoWork(e);
            //jesli trzeba stworzyc nowa kontrolke to wysylasz komunikat
            if (CreateControl != null)
                CreateControl();
        }
    }

Urzucie:

            Worker worker = new Worker();
            worker.CreateControl += new CreateControlHandler(WorkerCreateControl);
            //.....
            private void WorkerCreateControl()
            {
                     //tworzysz kontrolke
            }
0

niestety, ale w ironpythonie nie mogę korzystać z delegate :(

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