Wątki a kontrolki

0

Witam. Mam formatkę z jednym richtextboxem i jednym buttonem. Chciałbym aby po kliknięciu w button utworzyć w nowym wątku instancję klasy "Klasa" wywołując metodę która napisze coś w richtextboxie:

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

        private void button1_Click(object sender, EventArgs e)
        {
            new Thread(new ThreadStart(new Klasa().Run)).Start();
        }
    }

    class Klasa
    {
        Form1 frm = new Form1();
        public void Run()
        {
            frm.richTextBox1.Text += "tekst";
            MessageBox.Show("tekst");
        }
    }

Problem w tym że po kliknięciu w button tekst w richtextboxie nie pojawia się, a messagebox tak. Nie wywala przy tym żadnego wyjątku typu "cross-thread operation"... Próbowałem też z delegatami i efekt ten sam. W czym tkwi problem?? :|

0

tekst do kontrolek powinien byc ladowany w watku glownym (gui), podobnie jak inne operacje wplywajace na warstwe prezentacji
poczytaj o wlasciwosc Control.InvoreRequired i metodzie Control.Invoke()

0

Mówiłem że próbowałem już z delegatami a co za tym idzie również z właściwością Control.InvokeRequired oraz metodą Control.Invoke()... Rezultat ten sam co i bez użycia delegatów (nie wywala mi wyjątku cross-thread operation). Więc dlaczego tekst nie pojawia się w richtextboxie??? Any idea?? [???]

0

Powiedz Ty mi lepiej, po co Tworzysz nowy obiekt Form1 i wpisujesz coś do jego RichTextBoxa?

I oczywiście, że nie ma szans na wyjątek, skoro tworzysz sobie w nowym wątku nowy obiekt i na nim operujesz.

0

W takim razie jak z nowego wątku wpisać coś do tego richtextboxa nie tworząc przy tym nowego obiektu Form1??

0

hehe, w sumie nie spojrzalem dokladnie na kod :)
fakt maniek, poplynales

twoj form1 z klasy Klasa pewnie nawet nie jest pokazany (.Show())

powinno byc tak:
w watku gui tworzysz form1
odpalasz na klik przycisku nowy watek roboczy, ktory chce zmieniac dane na form1
watek roboczy wywoluje metode UstawText, ktora sprawdza InvokeRequired jesli jest false ustawia text, a jesli nie wywoluje siebie przez Invoke
mase przykladow tego schematu jest w sieci, poczytaj, zrozum, przeczwicz, powielaj

0

massther, nadal nie chwytasz :-/ Trzeci raz mówię że używałem już delegatów. Dokładnie wyglądało to tak:

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)
        {
            new Thread(new ThreadStart(new Klasa().Run)).Start();
        }
    }

    class Klasa
    {
        Form1 frm = new Form1();
        delegate void RunDelegate();
        public void Run()
        {
            if (frm.richTextBox1.InvokeRequired)
            {
                frm.richTextBox1.Invoke(new RunDelegate(Run));
                return;
            }
            frm.richTextBox1.Text += "tekst";
            MessageBox.Show("tekst");
        }
    }
}
somekind napisał(a)

Powiedz Ty mi lepiej, po co Tworzysz nowy obiekt Form1 i wpisujesz coś do jego RichTextBoxa?

I oczywiście, że nie ma szans na wyjątek, skoro tworzysz sobie w nowym wątku nowy obiekt i na nim operujesz.

Gdybyś mi lepiej wytłumaczył w czym jest tutaj problem i jak go rozwiązać, byłbym ci niezmiernie wdzięczny...

0
somekind napisał(a)

Powiedz Ty mi lepiej, po co Tworzysz nowy obiekt Form1 i wpisujesz coś do jego RichTextBoxa?

I oczywiście, że nie ma szans na wyjątek, skoro tworzysz sobie w nowym wątku nowy obiekt i na nim operujesz.

LOL przecież to było tak proste [glowa] dopiero teraz pomyślałem nad tym i już wszystko działa... Wystarczyło w konstruktorze klasy Klasa jako argument podać główną formatkę zamiast tworzyć nową heh :) Dzięki za naprowadzenie mnie co było tutaj źle xD pozdro

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