[C#] Threading

0

Witam! Mam nastepujaca sytuacje :

  1. Klasa A (jako biblioteka DLL) posiada :
public delegate void TeachingLogger(int Epo, double Erm);
private TeachingLogger LoggerFunction;
private Thread TeachingThread;

public void SetLoggerFunction(TeachingLogger function)
{
        LoggerFunction = function;
        LogFunction = true;
}

public void TeachingStart()
{
        TeachingThread = new Thread(new ThreadStart(this.Teach));
        TeachingThread.Start();
}

private void Teach()
{
        int epo = 0;
        double erm = 0.0;
        while(1==1)
        {
               LoggerFunction(epo,erm);
                epo++;
                erm+=1.0;
        }
}

Następnie mam klase B oparta o WindowsForms z dwoma labelami, korzystajaca z klasy A :

       
public void log(int Epo, double Erm)
{
        label1.Text = "Epoch : " + Epo.ToString();
        label2.Text = "ERMS : " + Erm.ToString();
        Application.DoEvents();
}
private void button1_Click(object sender, EventArgs e)
{
        A.Perceptron.SetLoggerFunction(log);
        A.TeachingStart(); 
}

No i niestety wywala mi blad, ze

Nieprawidłowa operacja między wątkami: do formantu 'label2' uzyskiwany jest dostęp z wątku innego niż wątek, w którym został utworzony.

Jakies pomysly?

0

bylo juz dziesiatki razy jak sie bezpiecznie odwolac do kontrolek z innych watkow
lektura: http://msdn.microsoft.com/en-us/library/ms171728.aspx

0

tak, z tym ze zaden z tych artykulow nie zaklada ze watek z ktorego chce aktualizowac kontrolke NIE JEST wywolywany z tego samego obiektu, ale z obiektu pochodzecego z innego namespace'a i nie dziedziczacego po Windows.Forms

0

dobra, problem rozwiazany, wylaczylem po prostu kontrole crossowych wywolan

Control.CheckForIllegalCrossThreadCalls = false;
0

tak, ale to nie zwalnia z myslenia i poprawnego zaprojektowania calego mechanizmu, przyklad ma obrazowac generalna zasade, a nie za ciebie napisac program

twoja klasa z innego namespace etc. konkretnie metoda Teach() wywoluje LoggerFunction(epo,erm); ktora wola public void log(int Epo, double Erm), ktora jak mi sie wydaje jest w klasie formularza
wiec zamiast w metodzie log na pale ustawiac teksty w labelkach
label1.Text = "Epoch : " + Epo.ToString();
zrob to jak masz w przykladzie w msdn napisane

0
j4hU napisał(a)

dobra, problem rozwiazany, wylaczylem po prostu kontrole crossowych wywolan

Control.CheckForIllegalCrossThreadCalls = false;

Działa Ci poza debugerem? Czemu tak bardzo chcesz pisać [CIACH!] kod?

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