Są sobie okna które mają referencję na maszynę stanów, która normalnie jest dostępna z "Kontrolera okien". Okna mogą przekazywać dane do maszyny stanów, by ta mogła decymować co jest do zrobienia dalej.
I teraz jest pytanie jak z okna wywołać wątek działający wewnątrz tej maszyny stanów, który coś policzy i na podstawie wyniku zmienić treść wyświetlanego okna następnego chwile po jego wyświetleniu?
Konkretne zadanie, chce po kliknięciu guzika, ściągnąć dane z serwera, wtedy użytkownik może kliknąć "dalej" aby przejść do następnego okna, i tam powinny już czekać przetworzone dane. nie będzie to trwało długo bo danych jest malutko, nie mniej lepiej jest chyba nie wstrzymywać wykonania programa na ten czas.
@wytrzzeszcz: podepnij jakis binding pod Okno1, ktory bedzie notyfikowal maszyne stanow, ze cos sie #!$%@?. W handlerze w maszynie uruchom Okno2 przekazujac mu dane przeslane (tez moze byc binding) z Okno1. Jak nie umiesz into binding to uzyj prostych eventow
@wytrzzeszcz: Możesz uruchomić proces, a potem pobrać wynik z obiektu Task. Jeśli to jest WPF(MVVM) to w ogóle bajka bo tam możesz bindować właściwości do kontrolek.
Ale w Windows Forms też można uzyskać aktualizowanie UI z wątków roboczych bez blokowania.
Maszyna-stanow.dajwynik()=>wynik; // tutaj event/task konczy działanie. i masz dane w propercie wynik, ale nie wiadomo, // czy uzytkownik już wcisnął 'dalej' czy dopiero to zrobi.
okno2.Load() { // w tym momencie powinieneś mieć dostęp do tych
INotifyPropertyChanged jest w maszynie i musi widzieć okno by mu coś powiedzieć? problem jest o tyle że okno widzi maszyne a maszyna nie widzi okna. @qubeq:
Mam aplikację jak na rysunku.
Są sobie okna które mają referencję na maszynę stanów, która normalnie jest dostępna z "Kontrolera okien".
Okna mogą przekazywać dane do maszyny stanów, by ta mogła decymować co jest do zrobienia dalej.
I teraz jest pytanie jak z okna wywołać wątek działający wewnątrz tej maszyny stanów, który coś policzy i na podstawie wyniku zmienić treść wyświetlanego okna następnego chwile po jego wyświetleniu?
Konkretne zadanie, chce po kliknięciu guzika, ściągnąć dane z serwera, wtedy użytkownik może kliknąć "dalej" aby przejść do następnego okna, i tam powinny już czekać przetworzone dane. nie będzie to trwało długo bo danych jest malutko, nie mniej lepiej jest chyba nie wstrzymywać wykonania programa na ten czas.
Ale w Windows Forms też można uzyskać aktualizowanie UI z wątków roboczych bez blokowania.
czyli jak
Okno1.Kontrolka.klikniete()
{
maszyna-stanów.cos-sie-dzieje()
}
maszyna-stanów.cos-sie-dzieje()
{
sciagnij-i-zrob.run()?
}
zrob-cos()
{
robi rzeczy
wynik=wynik-z-rzeczy;
}
Maszyna-stanow.dajwynik()=>wynik;
okno2.Load()
{
Maszyna-stanow.dajwynik()?
}
Okno1.Kontrolka.klikniete()
{
// tutaj odpalasz wątek, czy event ktory uruchomi kod do pobierania danych
maszyna-stanów.cos-sie-dzieje()
}
maszyna-stanów.cos-sie-dzieje()
{
sciagnij-i-zrob.run()?
}
zrob-cos()
{
robi rzeczy
wynik=wynik-z-rzeczy;
}
Maszyna-stanow.dajwynik()=>wynik;
// tutaj event/task konczy działanie. i masz dane w propercie wynik, ale nie wiadomo,
// czy uzytkownik już wcisnął 'dalej' czy dopiero to zrobi.
okno2.Load()
{
// w tym momencie powinieneś mieć dostęp do tych
Poczytaj sobie dokumentację bo jest bardzo dobra.
(wcześniej dałem stary link)
https://docs.microsoft.com/en-gb/dotnet/api/system.threading.tasks.task?view=netframework-4.7.1
@qubeq:
Maszyna implementuje INotifyPropertyChanged i nie musi wiedzieć kto z niej korzysta. Poczytaj o MVVM.