Cześć,
Mam pewien problem. Nie wiem jak w mojej aplikacji zakomunikować zmianę stanu obiektu mojej klasy aby wywołać określoną akcję po stronie GUI np. wypisanie czegoś do TextBoxa.
Moja aplikacja to prosty czat internetowy składający się z klienta( Główna formatka i klasa Klient) i serwera( Główna formatka i klasa Administrator).
Działa to mniej więcej tak, że klient łączy się z serwerem. Po stronie serwera w osobnym wątku jest prowadzony nasłuch czy ktoś nie chcę dołączyć się do rozmowy jeśli tak to tworzy dynamicznie nowy wątek:
BackgroundWorker clientThread = new BackgroundWorker();
clientThread.WorkerSupportsCancellation = true;
clientThread.DoWork += new DoWorkEventHandler(clientThread_DoWork);
Funkcja 'clientThread_DoWork' jest prywatną funkcją klasy Administrator. Wycinek funkcji 'clientThread_DoWork':
while ((cmd = read.ReadString().Split(new char[] { ':' }))[1] != "BYE" && bw.CancellationPending == false)
{
string message = null;
if (cmd.Length > 2)
{
message = cmd[2];
for (int i = 3; i < cmd.Length; i++)
message += " : " + cmd[i];
}
switch (cmd[1])
{
case "SAY":
//formatka.writeText(cmd[0], message); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
sendUdpMessage(cmd[0] + ":" + cmd[1] + ":" + message + "\n");
break;
}
}
I teraz nie wiem jak wymusić na Głównej formatce żeby w momencie jak przychodzi wiadomość od klienta ta w swoim TextBoxie wypisała tą wiadomość ( //formatka.writeText(cmd[0], message); ).
Mogę na sztywno w klasie Administrator dodać pole 'private Form1 formatka;' a w klasie formatki napisać:
public partial class Form1 : Form
{
Administrator admin;
public Form1()
{
InitializeComponent();
admin = new Administrator();
admin.formatka = this;
}
Wtedy wszystko działa ale czy jest zgodne z zasadą oddzielenia GUI od logiki aplikacji?