[C#] wątek

0

Witam!
Jeżeli był już podobny temat to przepraszam i proszę o link do niego.

Mam taki problem, chciałbym dodać do programu nowy wątek. Na początku chciałem zrobić coś prostego, tzn chciałbym aby po kliknięciu na przycisk zmieniała się wartość na labelu. Napisałem coś takiego:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Wątek w = new Wątek();
            Thread wątek = new Thread(new ThreadStart(w.uruchom));
            wątek.Start();
            label2.Text = wątek.ThreadState.ToString();
            while (wątek.ThreadState != ThreadState.Aborted)
            {
                w.uruchom();
                Thread.Sleep(500);
            }
        }
    }

    public class Wątek
    {
        private int i = 0;
        Form1 f = new Form1();
        public void uruchom()
        {
            f.label1.Text = i++.ToString();
        }
    }
}

Wydaje mi się, że teoretycznie program działa poprawnie natomiast praktycznie label1 ciągle wyświetla "label1".

Jakieś sugestie co do tego gdzie leży mój błąd?

0

Nie działa ci z kilku powodów:

  1. Po co ci w ogóle klasa Watek? Tworzysz tam obiekt klasy Form1. Daje ci to formę identyczną jak Form1, ale to nie jest ta sama forma.
    Gdybyś na tym obiekcie wywołał metodę Show() zobaczyłbyś, że pokazuje ci się druga forma, a po uruchomieniu metody uruchom() to własnie na
    tej drugiej formatce zmieni ci się label
  2. W OnClick buttona niepotrzebnie tworzysz obiekt klasy Watek, uzasadnienie powyżej
  3. Metodę uruchom() zdefiniuj w klasie Form1
  4. Po wywołaniu metody uruchom() tekst na labelu zmieni się tylko raz, więc musisz wziąć f.label1.Text = i++.ToString(); w jakąś pętlę
    i tam właśnie wstaw Sleep
  5. Poczytaj o Control.InvokeRequire, bo będzie ci wyrzucało błąd podczas edycji tekstu na labelz z poziomu innego wątku niż główny, albo
    zastosuj BackgroundWorker'a

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