Witam,

Piszę własną aplikację do testowania dowolnej klasy.
Sama dll-ka jest gotowa do użycia, ale dodatkowo chciałem stworzyć osobną dll-kę z formatkami, które byłyby gotowcami prezentującymi dane zwracanymi przez klasy testujące.

Krótko mówiąc:

  • Klasa kontrolna przechowująca w sobie klasy do przetestowania oraz pojedyncze metody.

  • Klasa ta wykonuje testy automatyczne i zapisuje w sobie wyniki.

  • Następnie opcjonalnie można wywołać gotową formatkę, która zaprezentuje wyniki w postaci GUI.

Chciałem jednak by na formatce pojawiał się ProgressBar ukazujący postęp prac. Ponieważ logika biznesowa testowania oddzielona jest od formatki, myślałem, że uda się to zrobić za pomocą wątków, ale... coś jest jednak nie tak.

Oto kod:

Kod na formatce:

private void MakeTestAll()
        {
            Thread workerThread = new Thread(ShowInfo);
            workerThread.Start();

            this.lblStatsInfo.Text = "Trwa testowanie...";
            this.ProgressTest.Maximum = this.testControl.GetMaxTest();

            Application.DoEvents();
            this.testControl.MakeTestAll();
            workerThread.Abort();

            this.SetDataSource();
            this.ViewGlobalResult();
            this.lblStatsInfo.Text = "OK";
        }

Kod ukazujący (w teorii) dane. Zmieniłęm tutaj ProgressBara na TextBox by zobaczyć jakie wyniki otrzymywane są w wątku.

delegate void SetTextCallback(string text);

        private void SetText(string text)
        {
            this.textBox1.Text += text + ", ";
        }

        private void ShowInfo()
        {
            while (true)
            {
                if (this.textBox1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetText);
                    textBox1.Invoke(d, new object[] { this.testControl.ProgressTest.ToString() });
                }
                else
                    SetText(this.testControl.ProgressTest.ToString());
            }
        }

Efekt jest taki, że wątek pobiera niby same zera. Co jest niemożliwe w teorii gdyż dane pobierane przez wątek powinny być stopniowo zwiększane. Oto dowód - funkcja w logice biznesowej:

 private int progressTest = 0;

public int ProgressTest
        {
            get { return this.progressTest; }
        }

public void MakeTestAll()
        {
            this.listResults.Clear();
            
            this.MakeTestClass();
            this.MakeTestFunction();

            this.progressTest = 0;
        }

private void MakeTestClass()
        {
            foreach (Test test in this.listTest)
            {
                test.MakeTest();
                this.listResults.AddRange(test.ListResult);
                this.progressTest++;
            }
        }

        private void MakeTestFunction()
        {
            foreach (Test.FuncOneTest test in this.listFunction)
            {
                ITest testInterface = (ITest)test.Target;
                Test testClass = testInterface.GetTest();
                testClass.ClearResult();
                testClass.MakeOneTest(test);
                this.listResults.AddRange(testClass.ListResult);
                this.progressTest++;
            }
        }

Czy ktoś może mi wyjaśnić dlaczego wątek pobiera same zera (zmienna progressTest w logice biznesowej jest niby nieaktualizowana) i w jaki sposób naprawić ten problem?
Może nie trzeba używać wątku?

Z wyrazami szacunku,
Mały Pomidor.