wielowątkowość w timerze

0

Robię program który updatuje informacje co jakąś ilość czasu.
metoda do update działa długo więc chciałbym wpakować ją w oddzielny wątek i pojawia mi się problem bo niby kod nie wskazuje nic źle ale w czasie trwania updatu timer nadal staje w miejscu na czas updateu na jakieś 10 sekund.

private void dodajwynikwatkudoglownego(object o) 
        {

            if (this.InvokeRequired) 
            {
                ParameterizedThreadStart z = new ParameterizedThreadStart(dodajwynikwatkudoglownego);
                this.Invoke(z, o);
            }
            else
            {

            }

        }
        double wynikUpdate;
        public void MetodaConvertujacaObjectdlawatkow(object o)
        {
            wynikUpdate = ZrobUbdate.UpdateCeny(Convert.ToInt16(o));
            o = wynikUpdate;
            dodajwynikwatkudoglownego(o);

        }
        public void timer1_Tick(object sender, EventArgs e)
        {
            string Query = " ";
            this.Text = "Update at 300 sec's. Counting : " + ticks.ToString();
            ticks++;
            if (ticks == 30)
            {
                
                for (int i = 0; i < 9; i++)
                {
                    ParameterizedThreadStart z = new ParameterizedThreadStart(MetodaConvertujacaObjectdlawatkow);
                    Thread watek = new Thread(z);
                    watek.Start(i);
                    
                    if (i == 0)
                    {
                        zmiennadoupdate = ZrobUbdate.UpdateCeny(i);
                        dzialanie_CzyDoGory(zmiennadoupdate);
                        textboxTritanium.Text = zmiennadoupdate.ToString();
                    }
                    if (i == 1)
                    {
                        zmiennadoupdate = ZrobUbdate.UpdateCeny(i);
                        dzialanie_CzyDoGory(ZrobUbdate.UpdateCeny(i));
                        textBoxPyerite.Text = zmiennadoupdate.ToString();
                    }
                    if (i == 2)
                    {
                        zmiennadoupdate = ZrobUbdate.UpdateCeny(i);
                        dzialanie_CzyDoGory(ZrobUbdate.UpdateCeny(i));
                        textBoxMexallon.Text = zmiennadoupdate.ToString();
                    }
                    if (i == 3)
                    {
                        zmiennadoupdate = ZrobUbdate.UpdateCeny(i);
                        dzialanie_CzyDoGory(ZrobUbdate.UpdateCeny(i));
                        textBoxIsogen.Text = zmiennadoupdate.ToString();
                    }
                    if (i == 4)
                    {
                        zmiennadoupdate = ZrobUbdate.UpdateCeny(i);
                        dzialanie_CzyDoGory(ZrobUbdate.UpdateCeny(i));
                        textBoxNocxium.Text = zmiennadoupdate.ToString();
                    }
                    if (i == 5)
                    {
                        zmiennadoupdate = ZrobUbdate.UpdateCeny(i);
                        dzialanie_CzyDoGory(ZrobUbdate.UpdateCeny(i));
                        textBoxZydrine.Text = zmiennadoupdate.ToString();
                    }
                    if (i == 6)
                    {
                        zmiennadoupdate = ZrobUbdate.UpdateCeny(i);
                        dzialanie_CzyDoGory(ZrobUbdate.UpdateCeny(i));
                        textBoxMegacyte.Text = zmiennadoupdate.ToString();
                    }
                    if (i == 7)
                    {
                        zmiennadoupdate = ZrobUbdate.UpdateCeny(i);
                        dzialanie_CzyDoGory(ZrobUbdate.UpdateCeny(i));
                        textBoxMorphite.Text = zmiennadoupdate.ToString();
                    }
                    if (i == 8)
                    {
                        zmiennadoupdate = ZrobUbdate.UpdateCeny(i);
                        dzialanie_CzyDoGory(ZrobUbdate.UpdateCeny(i));
                        textBoxHydrogen.Text = zmiennadoupdate.ToString();
                    }
                }
                PolaczenieserverSQL.Open();
                SqlDataReader SQLreader;
                SqlCommand command = new SqlCommand(Query, PolaczenieserverSQL);
                SQLreader = command.ExecuteReader();
                command = null;
                SQLreader.Dispose(); 
                PolaczenieserverSQL.Close();
                ticks = 0;
            }
        }

Jak zrobić lub co robię źle by timer spokojnie sobie chodzil podczas gdy w osobnym wątku robi się update?

0

Co jest w wątku? Kod w tej chwili tworzy jakiś wątek, a potem wszystkie trwające długo rzeczy i tak wykonuje w zdarzeniu cyknięcia timera.
BTW ten kod to śmietnik. Nieczytelne nazwy zmiennych, słabe formatowanie, nieznajomość podstaw programowania wielowątkowego.

0

ok to jak przenieść tą pętlę do nowego wątku?

0

ok , udało mi się trochę uporządkować....

 
private void robupdate(object o)
        {
            zmiennadoupdate = ZrobUbdate.UpdateCeny(Convert.ToInt16(o));
            dodajdoformawynik(o);
        }
private void dodajdoformawynik(object o)
        {
            TextBox[] TextBoxy = new TextBox[9] { textboxTritanium, textBoxPyerite, textBoxMexallon, textBoxIsogen, textBoxNocxium, textBoxZydrine, textBoxMegacyte, textBoxMorphite, textBoxHydrogen };
            for (int i = 0; i < 9; i++)
            {
                
                if (TextBoxy[i].InvokeRequired) 
                {
                    ParameterizedThreadStart z = new ParameterizedThreadStart(dodajdoformawynik);
                    this.Invoke(z, o); 
                }
                else
                {
                        TextBoxy[i].Text = zmiennadoupdate.ToString();
                }
            }
        }
        public void timer1_Tick(object sender, EventArgs e)
        {
            string Query = "INSERT z bazy (działający)";
            this.Text = "Update at 300 sec's. Counting : " + ticks.ToString();
            ticks++;
            if (ticks == 15)
            {
                    ParameterizedThreadStart z = new ParameterizedThreadStart(robupdate);
                    Thread watek = new Thread(z);
                    watek.Start();
                    dzialanie_CzyDoGory(zmiennadoupdate);
                    PolaczenieserverSQL.Open();
                    SqlDataReader SQLreader;
                    SqlCommand command = new SqlCommand(Query, PolaczenieserverSQL);
                    SQLreader = command.ExecuteReader();
                    command = null;
                    SQLreader.Dispose();
                    PolaczenieserverSQL.Close();
                    ticks = 0;
                
            }
        }

teraz problem polega na tym ,że we wszystkich textboxach pojawia się informacja która powinna się pojawić tylko w pierwszym.

0

Eee... Nadal odpalasz zapytanie w głównym wątku, a chyba miało być w nowym wątku? Rozumiesz co w ogóle robisz? Przeczytaj, jak się korzysta z wątków i jak się robi synchronizację.
Dowiedz się też, co to jest using i kiedy się to stosuje, bo masz potencjalne wycieki zasobów.

0

Ziomek oczywiście ,że mam.O watkach się dowiedziałem wczoraj na wykładach , jestem nogą a na za tydzień muszę je mieć zaimplementowane i nauczyć na 3 egzaminy.
Gdybym miał czas bym sobie poradzić z tym bym nie pytał.

edit:Tak czytam i czytam...Ty mówisz o zapytaniu do sql? O query? Ja nie chce query w nowym wątku zrobić ani nic z sql. Ja chce robić "robupdate" w nowym wątku.

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