[C#] wątek twardziel

0

Elo wszystkim...
tak sobie myślałem nad przyspieszeniem swojego programu bazo danowego przez wątki, wątki potworzyłem chociaż to jedna z pierwszych okazji do tego. Wszystko by było ok, gdyby nie to, że po wykonaniu iluś tam metod chcę zmienić dwie właściwości w formie, mianowicie
panel1.Visible = false; bo podczas włączenia wątka chciałem wyświetlić takie okienko, że trwa praca
dgv.DataSource = bsrc; po zakończeniu chcę wyświetlić wyniki;

no a debuger pozdrawia mnie tak, że mówi mi: "nie możesz zmieniać atrybutów rzeczom nie stworzonym w działającym wątku :)" tak mniej więcej... No ale nie wiem jak to zrobić, żeby jednak mógł:p

0

delegaty

0

I Invoke. Bylo pare razy na forum, poszukaj wedlug tego hasla to sie dowiesz sporo.

0
TwojaForma.Invoke(new EventHandler(delegate
{
    //Twój kod zmieniający coś na formie
}));
0

Ok jestem już po pewnych próbach i mam delegate i debuger wciaz mnie pozdrawia, w zasadzie to widzę, że nie wiele zmieniłem i jutro jak się wyśpie to porobię oddzielne delegaty dla wszystkich zmiennych w formie, a jak i to nie pomoże to wykasuje te wszystkie delegaty i wezmę się za literaturę :D w końcu się uda, a teraz wygląda to mniej więcej tak:

        public delegate void UpdateDGVSourceCallback();

        private void UpdateDGVSource()
        {
            panel1.Visible = false;
            ds = ObrobkaDanych.Wynik("",_tabelaWe, ds, false);
            BindingSource bsrc = new BindingSource();
            bsrc.DataSource = ds.ABF;
            dgv.DataSource = bsrc;
        }

         private void frm_wynik_Load(object sender, EventArgs e)
        {
            watek = new System.Threading.Thread(new System.Threading.ThreadStart(przejdzDoSortowania));
            watek.Start();
        }

        gdzieś pod koniec sortowania mam swoją delegatę

         private void wyswietlWyniki()
        {
            MessageBox.Show("Dane zostały posortowane...\n trwa wczytywanie wynikow sortowania",   "Gotowe");
            UpdateDGVSourceCallback updDGVsrc = new UpdateDGVSourceCallback(UpdateDGVSource);
            updDGVsrc.Invoke();
        }

Jutro do tego znowu zajrzę, jak ktoś mnie naprowadzi, albo poprawi kod... respect i thx.

0

To nie tak. To watek formatki ma wykonac operacje wywolana przez drugi watek. Cos w tym stylu

//kod formatki
public delegate void updateElement(object updateInfo);

public void updateSomething(object updateInfo)
{
  Invoke(new updateElement(realUpdateSomething), new object[]{updateInfo});
}

public void realUpdateSomething(object updateInfo)
{
  //tutaj wlasciwy kod update'u
}

//i w kodzie drugiego watku wywolujesz updateSomething

Mozna i w skrocie, tak jak napisal Misiekd, chociaz ja czasem wole ta forme, bo jest dla mnie bardziej przejrzysta jesli operacja jest troche bardziej skomplikowana.

0

dopiero dzisiaj wróciłem na stancje nie miałem netu, mam teraz do przygotowania pare rzeczy zaję się tym w wolnej chwili, ale z tego co napisałeś to chyba rozumiem już o co w tym chodzi :) Jeśli z tego korzystasz to również na pewno działa, Dzięki za helpa...

PS. czytam pewną książke o synchronizacji i o wątkachi wielowątkowości. trochę się pogubiłem kiedy należy stosować mutex, sekcje krytyczne, semafory. Czy delegaty np z wątku z tła będą działały również w takich wypadach ?? Czytałem, wprowadzają sporo zamieszania :/ Czy są jeszcze jakieś inne rozwiązania ?? Czy delegaty to jednak "zło konieczne" ? :

0

Nie wiem potrzebujesz semaforow i sekcji krytycznych. Jesli planujesz jakies bardziej skomplikowane synchronizowanie watkow to moze i tak.

Jednak do prostego zabezpieczenia sie przed zakleszczeniem watkow, czy problemem jednoczesnego dostepu wystarczy bardzo prosta funkcja lock(object obj);

Uzywa sie tego bardzo prosto, bez wiekszego zamieszania w kodzie.
Semafory - slyszalem, ze to technologia z przed 20-tu lat, ktora sie niewiele lub <ort>w ogóle </ort>nie zmienila - tak nawiasem.

0

@aristo: Semafory to nie technologia a idea rozwiazania pewnego problemu. Wiekszosc sortowan na przyklad to 'technologie' sprzed nawet 40-50 lat i co w tym zlego?

I zgodze sie, ze w wiekszosci zwyklych przypadkow lock wystarcza.

0

Tutaj jest co prawda przykład z BackgroundWorker, ale widać tam jak korzystać z delegatów do odwoływania się do elementów interfejsu użytkownika z innego wątku:

http://polishwords.com.pl/video_tutorials.php?cat_id=4&faq_id=35

0

Fajnie tylko nie mogę się zarejestrować :p ciągle wyskakuje mi błąd o nie właściwym kodzie z obrazka, a wpisywałem może 5 razy i chyba ślepy nie jestem :D

0

bo od tylu trzeba wpisać :P

0

Jak to zwal tak to zwal. Chodzilo mi o to, ze nic nowego i prostszego od tego czasu nie wymyslono.

Pozdrawiam
Mariusz

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