Dziwny problem z wątkiem

0

Witam!

Mam oto takie dwie klasy:
Form1:

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

            pictureBox1.Image = new Bitmap(461, 358);
            g = Graphics.FromImage(pictureBox1.Image);

            
            
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A)
            {
                D d = new D();

                ThreadStart ts = new ThreadStart(d.f);

                Thread t = new Thread(ts);

                t.Start();
            }
        }
    }
}

oraz klasę D:

namespace WindowsFormsApplication1
{
    class D : Form1
    {

        public void f()
        {
            g.FillRectangle(Brushes.Black, 10, 10, 20, 20);

            pictureBox1.Refresh();
        }
    }
}

Problem polega na tym, że po wduszeniu klawisza 'A' nic się nie dzieje - gdy wpisuję kod z funkcji f() aby wykonywał się bezpośrednio w "kodzie klawisza 'A' " wszystko jest ok - rysuje się kwadrat. Jeśli jednak jest tak jak powyżej, tzn. ma się ten kod wykonać poprzez nowo uruchomiony wątek - nic się nie dzieje.
Nie wiem czy to problem z dziedziczeniem, czy z czym... [rotfl]

PS. Dla ścisłości powiem że pictureBox1 został stworzony w Designerze i ma on ustawioną właściwość Modifiers na Public, a kompilator nie zgłasza żadnych errorów czy warningów.

Z góry wielkie dzięki [browar]

0

Jak dla mnie to twój kod jest strasznie pokręcony. Albo robisz coś strasznie zawiłego (z kodu to nie wynika) albo robisz to źle.
W tym kodzie co masz brakuje ci pokazania formy D (tj. d.Show()) po jej stworzeniu, ale dodatkowo będziesz miał problem z operacjami na UI tworzonymi z innego wątku więc nawet jak dasz to Show to aplikacja ci się wywali.

Jeśli chcesz uniknąć wyjątku to daj:
pictureBox1.Invoke(new Action(pictureBox1.Refresh)); Zamiast samego pictureBox1.Refresh();

Cały kod:

    public partial class Form1 : Form
    {
        public Graphics g;

        public Form1()
        {
            InitializeComponent();

            pictureBox1.Image = new Bitmap(461, 358);
            g = Graphics.FromImage(pictureBox1.Image);



        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A)
            {
                D d = new D(); /* wg mnie tu nie chcesz tworzyć nowego okna*/
               d.Show(); // <--------- pokaż nowo otworzone okno
                ThreadStart ts = new ThreadStart(d.f);

                Thread t = new Thread(ts);

                t.Start();
            }
        }
    }

    class D : Form1
    {

        public void f()
        {
            g.FillRectangle(Brushes.Black, 10, 10, 20, 20);

           pictureBox1.Invoke(new Action(pictureBox1.Refresh)); // <-- wywołaj operację w wątku UI
        }
    }

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