WPF - wielowątkowość

WPF - wielowątkowość
P0
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:57
0

Witam!
Na początku programu ustawiam że okienko 1 ma się uruchamiać na ekranie pierwszym, a okienko 2 na ekranie 2. W ten sposób:

Kopiuj
public void UstawOkna(Window w_sterowania, Window w_wyswietlania)
        {
            drawing.Rectangle panelSterowania= screen.AllScreens[0].WorkingArea;
            drawing.Rectangle panelWyswietlania = screen.AllScreens[1].WorkingArea;

            w_sterowania.Top = panelSterowania.Top;
            w_sterowania.Left = panelSterowania.Left;

            w_wyswietlania.Top = panelWyswietlania.Top;
            w_wyswietlania.Left = panelWyswietlania.Left;

            w_sterowania.WindowStyle = WindowStyle.None;
            w_wyswietlania.WindowStyle = WindowStyle.None;

            w_sterowania.WindowState = WindowState.Maximized;
            w_wyswietlania.WindowState = WindowState.Maximized;
        }

Następnie w drugim wątku puszczam sprawdzanie czy przypadkiem kabel nie został odłączony (jeśli tak się stanie informuję o tym użytkownika). Dalej zostaje sprawdzone czy monitor został podłączony (while + thread.sleep(2000)), jeśli został podłączony to chciałbym ponownie ustawić okienka na odpowiednich ekranach - i tu pojawia się problem o następującej treści:

Kopiuj
"Wątek wywołujący nie może uzyskać dostępu do tego obiektu, ponieważ należy on do innego wątku."

Poszukałem co na to google i znalazłem następujący temat:
Problem z watkiem
Próbowałem na różne sposoby użyć tego Dispatcher.Invoke(...) ale niestety bez powodzenia.
Może ktoś też miał taki problem i udało mu się go rozwiązać?
Funkcja wywoływana w wątku jest taka

Kopiuj
UstawOkna(this, PW)
unikalna_nazwa
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
0

przekaż dispatcher wątka UI wątkowi potomnemu
przy tworzeniu zapamiętaj

Dispatcher dispatcher = Dispatcher.CurrentDispatcher;

a potem z wątka potomnego wywołuj NA NIM Invoke


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 1x, ostatnio: unikalna_nazwa
P0
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:57
0

Z jakimi parametrami trzeba wywołać tego

Kopiuj
dispatcher.Invoke

czego bym nie wpisał wyskakuje niezgodna liczba wymaganych parametrów :/

Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:25 minut
0

http://msdn.microsoft.com/en-us/library/hh199416.aspx

Więc w najprostszej postaci coś w stylu:

Kopiuj
Dispatcher.Invoke(() => 
{
    // jakaś logika
});

Tylko pamiętaj, że Invoke jest blokujące. Dla bardzo rozbudowanych operacji lepsze będzie użycie BeginInvoke.

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.begininvoke%28v=vs.110%29.aspx

P0
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:57
0

Przy Twoim sposobie otrzymuję:
Nie można przekonwertować wyrażenie lambda na typ „System.Delegate”, ponieważ nie jest to typ delegowany.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
0
Pawlak007 napisał(a):

Przy Twoim sposobie otrzymuję:
Nie można przekonwertować wyrażenie lambda na typ „System.Delegate”, ponieważ nie jest to typ delegowany.

Odinstaluj z systemu polski pakiet językowy dla .NET Framework, i wklej treść błędu w ludzkim języku.

P0
Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
somekind
To zrzutuj tą lambdę na Action.
P0
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:57
0

Próbowałem w ten sposób:

Kopiuj
dispatcher.Invoke((Action)delegate 
                            {
                                this.UstawOkna(this, PW);
                            });

Okno sie przesuwa na drugi ekran ale nie dopasowuje się do rozdzielczości ekranu

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.