Thread View: alt.pl.comp.lang.csharp
13 messages
13 total messages
Started by gomis
Fri, 09 Jul 2010 08:38
Własne okno dialogowe singleton, wywoływane z wątków?
Author: gomis
Date: Fri, 09 Jul 2010 08:38
Date: Fri, 09 Jul 2010 08:38
29 lines
1804 bytes
1804 bytes
Witam.
Mam taki problem.
Muszę wykonać okno typu MessageBox lub MessageDialog, które może wyświetlać
komunikaty z róznych wątków. Obecnie wykonałem taką formę w oparciu o typ
Singleton. Program jednak potyka mi się gdy chcę wywołac okno z poziomu
różnych wątków. Zwłaszcza gdy następuje odwołanie to elementów tegoz okna
metodami Visible,Show itp. Wiem jak należy wykonać własnego refresha okna:
private delegate void MRefreshDelegate();
public void MRefresh()
{
if (FMsg.Instance.InvokeRequired)
{
FMsg.Instance.Invoke((MRefreshDelegate)delegate
{
FMsg.Instance.Refresh();
});
} }
Natomiast nie wiem jak prawidłowo kreować okno z poziomu wątków. Może są
jakieś inne rozwiązania tego problemu?
Pozdrawiam i dzięki za pomoc,
gomis.
Re: Własne okno dialogowe singleton, wywoływane z wątków?
Author: Łukasz 'Maly' Ostrowski
Date: Fri, 09 Jul 2010 10:15
Date: Fri, 09 Jul 2010 10:15
53 lines
2625 bytes
2625 bytes
On Fri, 9 Jul 2010 10:38:51 +0200, gomis wrote:
> Mam taki problem.
> Muszę wykonać okno typu MessageBox lub MessageDialog, które może wyświetlać
> komunikaty z róznych wątków. Obecnie wykonałem taką formę w oparciu o typ
> Singleton. Program jednak potyka mi się gdy chcę wywołac okno z poziomu
> różnych wątków. Zwłaszcza gdy następuje odwołanie to elementów tegoz okna
> metodami Visible,Show itp. Wiem jak należy wykonać własnego refresha okna:
>
> private delegate void MRefreshDelegate();
> public void MRefresh()
> {
> if (FMsg.Instance.InvokeRequired)
> {
> FMsg.Instance.Invoke((MRefreshDelegate)delegate
> {
> FMsg.Instance.Refresh();
> });
>
> } }
>
>
>
> Natomiast nie wiem jak prawidłowo kreować okno z poziomu wątków. Może są
> jakieś inne rozwiązania tego problemu?
Okno nie powinno być kreowane przez wątek inny niż wątek UI,
takich wątków jest precyzyjnie jeden ;-). I to ten wątek jest
ownerem i dispatcherem tego okna, ponieważ jako jedyny wisi
w message pump'ie.
Dostęp do wszystkich innych metod tego okna powinien wyglądać
analogicznie do Refresh. Poprzez Invoke.
if(ctrl.InvokeRequired)
{
ctrl.Invoke(new SomeDelegate(() => {
ctrl.Show();
}))
}
Ew. można "powiadamiać" (okno głowne/watęk UI) aplikacji
że ma coś wyświetlić.
Ile osób tyle rozwiązań, i ile założeń funkcjonalnych
tyle problemów z tymi rozwiązaniami ;-). Napisz coś
więcej - np. po co chcesz właściwie tworzyć okno w
wątku pobocznym?
P.s. Czemu to jest właściwie Singleton?
--
Pozdrawiam,
Łukasz 'Maly' Ostrowski. http://l3v.pl/
Re: Własne okno dialogowe singleton, wywoływane z wątków?
Author: gomis
Date: Fri, 09 Jul 2010 10:48
Date: Fri, 09 Jul 2010 10:48
22 lines
2020 bytes
2020 bytes
>
> Ile osób tyle rozwiązań, i ile założeń funkcjonalnych
> tyle problemów z tymi rozwiązaniami ;-). Napisz coś
> więcej - np. po co chcesz właściwie tworzyć okno w
> wątku pobocznym?
>
Dzięki za szybką odpowiedź.
> P.s. Czemu to jest właściwie Singleton?
Nie jest w szczególny sposób przywiązany do Singleton, ale .... pisałem
dotychczas w Delphi i nie potrafię jeszcze myśleć w C#. Mam takie nawyki z
D. by budować globalne formatki w tym przypadku okno typu ShowMessageBox.
Chętnie poznam nowe i zapewne lepsze rozwiązanie.
Tak jak pisałem wcześnie chcę wyrzucać txt na swoje okno dialogowe. Własne
ikony typu yes,now ... itp.
Potrzeba wyświetlenia komunikatu może pojawić się w różnych wątkach. Czasem
może powstać sytuacją, że jeden wątek wyświetli komunikat a użytkownik nie
zamknął okna a drugi wątek może "chcieć" zaktualizować tekst.
Jeszcze raz dzięki za pomoc i pozdrawiam,
gomis.
Re: Własne okno dialogowe singleton, wywoływane z wątków?
Author: Łukasz 'Maly' Ostrowski
Date: Fri, 09 Jul 2010 11:04
Date: Fri, 09 Jul 2010 11:04
42 lines
2895 bytes
2895 bytes
On Fri, 9 Jul 2010 12:48:16 +0200, gomis wrote: >> P.s. Czemu to jest właściwie Singleton? > Nie jest w szczególny sposób przywiązany do Singleton, ale .... pisałem > dotychczas w Delphi i nie potrafię jeszcze myśleć w C#. Mam takie nawyki z > D. by budować globalne formatki w tym przypadku okno typu ShowMessageBox. Delphi powoduje całą mase złych nawyków ;-). Począwszy od globalnego: var frmMain : TMainForm; aż po: - Na której zakładce znajdę komponent do dodawania, oraz, na której jest komponent TQuake3Engine? ;-) > Chętnie poznam nowe i zapewne lepsze rozwiązanie. > Tak jak pisałem wcześnie chcę wyrzucać txt na swoje okno dialogowe. Własne > ikony typu yes,now ... itp. Może lepiej powiadom okno głowne żeby coś wyswietliło? Później troche synchronizacji i wątek poboczny może "poczekać" na Yes/No/Cancel z wątku UI. > Potrzeba wyświetlenia komunikatu może pojawić się w różnych wątkach. Czasem > może powstać sytuacją, że jeden wątek wyświetli komunikat a użytkownik nie > zamknął okna a drugi wątek może "chcieć" zaktualizować tekst. Otóż to, z Singleton'em będzie taki problem. Jest jeszcze jeden problem nawet jeżeli nie będzie Singletonem, jesteśmy przyzwyczajeni że takie dialogi są modalne, co się stanie jeżeli dwa wątki pokrzykną "Pokaż Yes/No"? Pokazać dwa osobne okna? Kolejkować requesty i pokazywać dialogi po kolei? A może ten dialog nie musi być modalny, i można ich pokazać 4 naraz nie blokując aktywności okna rodzica? A może wątek poboczny w ogóle nie potrzebuje żadnych dialogów wyświetlać, tylko design architekturalny jest nietrafiony ;-)? (Czarny scenariusz ;-)) Znowu, mocno zależne od specyfiki aplikacji. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.pl/
Re: Własne okno dialogowe singleton, wywoływane z wątków?
Author: gomis
Date: Fri, 09 Jul 2010 11:46
Date: Fri, 09 Jul 2010 11:46
37 lines
2702 bytes
2702 bytes
> Delphi powoduje całą mase złych nawyków ;-). Począwszy od globalnego:
> var
> frmMain : TMainForm;
Sam widzę, że mam ciągoty jak napisałeś typu:
> var
> frmMain : TMainForm;
Też myślałem o wyrzucaniu okna dialogowego z głównego wątku, ale... znowu
pod górę. Nie wiem jak podpiąć się pod główny wątek.
W Delphi jest
Application.OnIdle:=MyOnIdle; // MyOnIdle - moja jakaś procedura
a dokładanie do Timerka wydaje się być mało estetyczne.
Mam jeszcze jedne problem (aż wstyd powiedzieć, ale takie są początki) nie
wiem jak wymieniać dane między "niezależnymi" klasami.
Jak już wcześniej przytoczona sławna konstrukcja
> var
> frmMain : TMainForm;
daje swobodę wymiany między formami to jedynie na tą modłę znalazłem
Singleton.
Jeśli chodzi o wątek główny to myślałem o budowie klasy class MojeAlerty, do
której wątki wrzucały by txt do wyświetlenia a następnie a główny sprawdzał
by czy nie trzeba wyświetlić okna lub już otwarte okno zaktualizować nowym
tekstem. Lecz klasa MojeAlerty powinna mieć tylko jedną instancję w cały
programie a przekazywanie jej wskaźnika do innych klas a od tych klas do
innych klas ... przez konstruktora też mi się nie podoba. Jakbym nie
kombinował to przy obecnym stanie wiedzy najbardziej pasuje mi Singleton.
Nie potrawie oderwać się (jeszcze nie wiem jak) od zmiennej globalnej.
Wiem, że powinienem oprzeć się na delegatach, ale jeszcze tego nie czuję.
Nie przewiduję okien modalnych.
Pozdrawiam,
gomis.
Re: W�asne okno dialogowe singleton, wywo�ywane z w�tk�w?
Author: Przemyslaw Osmanski
Date: Fri, 09 Jul 2010 12:19
Date: Fri, 09 Jul 2010 12:19
27 lines
1929 bytes
1929 bytes
W dniu 2010-07-09 12:48, gomis pisze: >> >> Ile os�b tyle rozwi�za�, i ile za�o�e� funkcjonalnych >> tyle problem�w z tymi rozwi�zaniami ;-). Napisz co� >> wi�cej - np. po co chcesz w�a�ciwie tworzy� okno w >> w�tku pobocznym? >> > > Dzi�ki za szybk� odpowied�. > >> P.s. Czemu to jest w�a�ciwie Singleton? > Nie jest w szczeg�lny spos�b przywi�zany do Singleton, ale .... pisa�em > dotychczas w Delphi i nie potrafi� jeszcze my�le� w C#. Mam takie nawyki z > D. by budowa� globalne formatki w tym przypadku okno typu ShowMessageBox. Ty nie pisałeś w Delphi ( w kontekście tego co piszesz powyżej ) tylko się bawiłeś... W każdym języku/środowisku można zrobić taką g... robotę. W Delphi jedynie nie trzeba się szczególnie starać i pozostać na poziomie klikacza który dopiero co zainstalował Delphi. pozdrawiam, Przemek O. -- www.soft-system.pl
Re: W?asne okno dialogowe singleton, wywo?ywane z w?tk?w?
Author: gomis
Date: Fri, 09 Jul 2010 12:26
Date: Fri, 09 Jul 2010 12:26
36 lines
2202 bytes
2202 bytes
Użytkownik "Przemyslaw Osmanski" <przemek@spam.stop.pl> napisał w wiadomości
news:4c3713c4$1@news.home.net.pl...
>W dniu 2010-07-09 12:48, gomis pisze:
>>>
>>> Ile os?b tyle rozwi?za?, i ile za?o?e? funkcjonalnych
>>> tyle problem?w z tymi rozwi?zaniami ;-). Napisz co?
>>> wi?cej - np. po co chcesz w?a?ciwie tworzy? okno w
>>> w?tku pobocznym?
>>>
>>
>> Dzi?ki za szybk? odpowied?.
>>
>>> P.s. Czemu to jest w?a?ciwie Singleton?
>> Nie jest w szczeg?lny spos?b przywi?zany do Singleton, ale .... pisa?em
>> dotychczas w Delphi i nie potrafi? jeszcze my?le? w C#. Mam takie nawyki
>> z
>> D. by budowa? globalne formatki w tym przypadku okno typu ShowMessageBox.
>
> Ty nie pisałeś w Delphi ( w kontekście tego co piszesz powyżej ) tylko się
> bawiłeś... W każdym języku/środowisku można zrobić taką g... robotę. W
> Delphi jedynie nie trzeba się szczególnie starać i pozostać na poziomie
> klikacza który dopiero co zainstalował Delphi.
>
>
>
> pozdrawiam,
> Przemek O.
>
> --
> www.soft-system.pl
Krytykę też przyjmuję ... lecz może coś bardziej kontruktywnego?
Pozdrawiam,
gomis.
Re: Własne okno dialogowe singleton, wywoływane z wątków?
Author: Przemyslaw Osmanski
Date: Fri, 09 Jul 2010 12:27
Date: Fri, 09 Jul 2010 12:27
30 lines
2201 bytes
2201 bytes
W dniu 2010-07-09 13:04, Łukasz 'Maly' Ostrowski pisze: > Delphi powoduje całą mase złych nawyków ;-). Począwszy od globalnego: > var > frmMain : TMainForm; > aż po: > - Na której zakładce znajdę komponent do dodawania, oraz, na której > jest komponent TQuake3Engine? ;-) I tak i nie. Pierwszy przykład jest typowy dla mało doświadczonych klepaczy. Po prostu, środowisko działa tak domyślnie. W końcu to RAD, a konwencja zastosowana w Delphi jest jego konsekwencją. Co nie znaczy, że tak należy robić i że wszyscy tak robią. IMHO każdy w pewnym momencie zauważa, że to nie zawsze jest najlepsze rozwiązanie, w szczególności z autocreate form. Drugie natomiast jest efektem czegoś co jest najlepsze w Delphi - czyli koncepcji VCLa. Dla niektórych "programowanie" polega na znalezieniu odpowiedniego komponentu i ciapnięcie go na formę. Zresztą jak patrzę na VS to powoli też zostało w ogólnym mniemaniu do tego sprowadzone. Tak czy tak, sama możliwość pisania w ten sposób nie oznacza że jest to jedyny lub jedynie słuszny sposób. pozdrawiam, Przemek O. -- www.soft-system.pl
Re: W?asne okno dialogowe singleton, wywo?ywane z w?tk?w?
Author: Przemyslaw Osmanski
Date: Fri, 09 Jul 2010 12:28
Date: Fri, 09 Jul 2010 12:28
12 lines
1236 bytes
1236 bytes
W dniu 2010-07-09 14:26, gomis pisze: > Krytyk� te� przyjmuj� ... lecz mo�e co� bardziej kontruktywnego? Konstruktywne jest to, że sprostowałem głupotę która później przylega do środowiska. pozdrawiam, Przemek O. -- www.soft-system.pl
Re: W?asne okno dialogowe singleton, wywo?ywane z w?tk?w?
Author: gomis
Date: Fri, 09 Jul 2010 12:31
Date: Fri, 09 Jul 2010 12:31
11 lines
1377 bytes
1377 bytes
>> Krytyk? te? przyjmuj? ... lecz mo?e co? bardziej kontruktywnego?
>
> Konstruktywne jest to, że sprostowałem głupotę która później przylega do
> środowiska.
OK. Lecz to nie jest tematem tego wątku.
Proponuję załóż osobny wątek.
Pozdrawiam,
gomis.
Re: Własne okno dialogowe singleton, wywoływane z wątków?
Author: Łukasz 'Maly' Ostrowski
Date: Fri, 09 Jul 2010 13:05
Date: Fri, 09 Jul 2010 13:05
47 lines
3211 bytes
3211 bytes
On Fri, 09 Jul 2010 14:27:24 +0200, Przemyslaw Osmanski wrote: > W dniu 2010-07-09 13:04, Łukasz 'Maly' Ostrowski pisze: > >> Delphi powoduje całą mase złych nawyków ;-). Począwszy od globalnego: >> var >> frmMain : TMainForm; >> aż po: >> - Na której zakładce znajdę komponent do dodawania, oraz, na której >> jest komponent TQuake3Engine? ;-) > > I tak i nie. Pierwszy przykład jest typowy dla mało doświadczonych > klepaczy. Po prostu, środowisko działa tak domyślnie. W końcu to RAD, a > konwencja zastosowana w Delphi jest jego konsekwencją. Co nie znaczy, że > tak należy robić i że wszyscy tak robią. IMHO każdy w pewnym momencie > zauważa, że to nie zawsze jest najlepsze rozwiązanie, w szczególności z > autocreate form. Bardzo rzadko "domyślnie" jest "dobrze". Ale z reguly jest "szybko", a jak wiadomo, "szybko" to jest najczęstsza ścieżka obierana przez kierownictwo korporacyjne ;-). - Możecie to zrobić szybko? - Tak, w 2 tygodnie. Ale też możemy zrobić powoli, stosując wszelkiego rodzaju patterny, nowinki i zajebiście czysty kod. To zajmie 3 miesiące. Ale w projekt będą mogli zajrzeć ludzie z ulicy i będą mogli go maintainować. - Nie kpij Kowalski, zaczynajcie opcje pierwszą, biegusiem. Exaggeration celowy ;-). > Drugie natomiast jest efektem czegoś co jest najlepsze w Delphi - czyli > koncepcji VCLa. Dla niektórych "programowanie" polega na znalezieniu > odpowiedniego komponentu i ciapnięcie go na formę. Zresztą jak patrzę na > VS to powoli też zostało w ogólnym mniemaniu do tego sprowadzone. Niewatpliwie, ale na pl.comp.lang.delphi osoby przychodzące po "komponent który robi coś bardzo specyficznego lub/i prostego" były stosunkowo częste swojego czasu, skrajnie irytujące. Od jakiegoś czasu nie przeglądam p.c.l.d więc może to się zmieniło. > Tak czy tak, sama możliwość pisania w ten sposób nie oznacza że jest to > jedyny lub jedynie słuszny sposób. Oczywiście, że nie jest. Podkreślam obecność ";-)" w orginalnym poście. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.pl/
Re: Własne okno dialogowe singleton, wywoływane z wątków?
Author: Łukasz 'Maly' Ostrowski
Date: Fri, 09 Jul 2010 13:36
Date: Fri, 09 Jul 2010 13:36
73 lines
4058 bytes
4058 bytes
On Fri, 9 Jul 2010 13:46:44 +0200, gomis wrote: > Sam widzę, że mam ciągoty jak napisałeś typu: > >> var >> frmMain : TMainForm; Spodziewane ;-). > Też myślałem o wyrzucaniu okna dialogowego z głównego wątku, ale... znowu > pod górę. Nie wiem jak podpiąć się pod główny wątek. Musisz przerzucić execution context do wątku UI - robi się to właśnie za pomocą Invoke - powoduje to wrzucenie do kolejki komunikatów komunikatu który niesie ze sobą delegate'a na to co ma być wykonane w tymże wątku UI. > W Delphi jest > > Application.OnIdle:=MyOnIdle; // MyOnIdle - moja jakaś procedura > a dokładanie do Timerka wydaje się być mało estetyczne. To jest na pierwszy rzut oka ***bardzo zła metoda***. > Mam jeszcze jedne problem (aż wstyd powiedzieć, ale takie są początki) nie > wiem jak wymieniać dane między "niezależnymi" klasami. Pamiętaj że możesz klasy poinformować o swoim istnieniu, przekazując nawzajem "siebie" w konstruktorach. Tight-coupling jest dyskusyjny, ale jest prosty i szybki. ;-). > Jak już wcześniej przytoczona sławna konstrukcja >> var >> frmMain : TMainForm; > daje swobodę wymiany między formami to jedynie na tą modłę znalazłem > Singleton. Singleton, ServiceLocator, przekazanie sobie wzajemnie referencji, każda metoda działa. > Jeśli chodzi o wątek główny to myślałem o budowie klasy class MojeAlerty, do > której wątki wrzucały by txt do wyświetlenia a następnie a główny sprawdzał > by czy nie trzeba wyświetlić okna lub już otwarte okno zaktualizować nowym > tekstem. Lecz klasa MojeAlerty powinna mieć tylko jedną instancję w cały > programie a przekazywanie jej wskaźnika do innych klas a od tych klas do > innych klas ... przez konstruktora też mi się nie podoba. Jakbym nie > kombinował to przy obecnym stanie wiedzy najbardziej pasuje mi Singleton. Jest jakiś pomysł. Aczkolwiek naprawde w minimalistycznej wersji zrobić Invoke na main formie. I masz już bardzo ubogą namiastkę komunikacji z wątkiem UI. > Nie potrawie oderwać się (jeszcze nie wiem jak) od zmiennej globalnej. Nie musi być globalna, może być "pozornie lokalna" - prywatne/protected pole czegoś większego, hosta. Main form może być "jeden", ten sama form może zawierać dispatcher komunikatów Twoj, z którym komunikować się będą wątki które stworzył ten main form. Wtedy globalnym-pseudo-singletonem jest tylko rzeczony main form. > Wiem, że powinienem oprzeć się na delegatach, ale jeszcze tego nie czuję. Delegate to jest function/method pointer(z dodatkową obsługą multicast, w przeciwieństwie do eventów z Delphi). Odpowiednikiem, pi razy drzwi z Object Pascala jest: type TJakisDelegat = function(AArgument1 : integer)/* of class*/; Nic tu do czucia nie ma skomplikowanego, pytaj jeżeli nie rozumiesz. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.pl/
Re: Własne okno dialogowe singleton, wywoływane z wątków?
Author: gomis
Date: Thu, 15 Jul 2010 06:27
Date: Thu, 15 Jul 2010 06:27
11 lines
1344 bytes
1344 bytes
> --
> Pozdrawiam,
> Łukasz 'Maly' Ostrowski. http://l3v.pl/
Dzięki za pomoc.
Temat już wykonałem.
Pozdrawiam,
gomis.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads