WPF - wielowątkowość

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:

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:

"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

UstawOkna(this, PW)
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

0

Z jakimi parametrami trzeba wywołać tego

dispatcher.Invoke

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

0

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

Więc w najprostszej postaci coś w stylu:

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

0

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

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.

0

Próbowałem w ten sposób:

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

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

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