Wielowątkowość i aktualizacja kontrolek

0

Mam dwie klasy. Drugi obiekt wykonywany jest w drugim wątku i potrzebuję aby raportował (string) do kontrolki w pierwszym obiekcie (textbox) i zgłaszał postęp procentowy do ProgressBar, który również znajduje się w pierwszym obiekcie...
Czytałem o delegatach, ale nie wiem jak je w tym konkretnym przypadku zastosować. :-/

Z góry dziękuję za pomoc!

0

Zobacz tutaj.

0

Mam zrobione delegaty z Invoke, ale jak po nie sięgnąć z drugiej klasy?

OK, mam tak:
Klasa otrzymująca dane:

public delegate void UpdateLogDelegate(string logMessage);
public partial class MainWindow : Form
    {
        public UpdateLogDelegate UpdateLog;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void UpdateLogMethod(string logMessage)
        {
            if (this.richTextBox.InvokeRequired)
            {
                UpdateLog = new UpdateLogDelegate(UpdateLogMethod);
                this.Invoke(UpdateLog, logMessage);
            }
            else
            {
                this.richTextBox.AppendText(logMessage);
            }
        }
//...
        private void backgroundWorkerSynchronization_DoWork(object sender, DoWorkEventArgs e)
        {
            Synchronization Sync = new Synchronization();
            Sync.UpdateLog = new UpdateLogDelegate(UpdateLogMethod);
            Sync.performSomething();
        }

Klasa, która powinna zgłaszać dane:


class Synchronization
    {
        public UpdateLogDelegate UpdateLog;
        private void performSomething()
        {
            //........
            AddTextToLog(env.NewLine + "Połączenie z bazą danych z MSSQL zakończone powodzeniem!");
        }
        public void AddTextToLog(string logMessage)
            {
                UpdateLog(logMessage);
            }

Przy próbie wywołania AddTextToLog w klasie Synchronization otrzymuję komunikat:
Object reference not set to an instance of an object

Który pokazuje na:
public UpdateLogDelegate UpdateLog;

0

Chyba lepiej by bylo przekazac do klasy Synchronization referencje na klase MainWindow i zmienic metode UpdateLogMethod na publiczna. Wtedy prosto ja wywolasz :)

Jak chcesz koniecznie z delegatami, to muisisz stworzyc instacje delegata w klasie Synchronization (np w konstruktorze do ktorego bedziesz przekazywal jako parametr delegata), bo w Twoim kodzie UpdateLog w Syncrhonization jest nullem, wiec jak go chcesz wywolac?

0
wasiu napisał(a)

Chyba lepiej by bylo przekazac do klasy Synchronization referencje na klase MainWindow

Referencję? Jak? :-)

Edytka:

Synchronization Sync = new Synchronization(this);

Tak może być? Bo działa ;-P

0

Hehe, no ja bym to identycznie zrobil :P

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