Omlouvám se, špatně jsem se ve spěchu vyjádřil (manželka již někde stepovala na rohu ulice a musel jsem pro ni), měl jsem spíše napsat, že to nejde v intencích mých znalostí. Život mne naučil, že slovní spojení "to nejde" je v 99% případů alibistické vyjádření skutečnosti, že buď, "to neumím", nebo ,ještě hůře, "se mi nechce. Ale i tak dík. P.S: přece jenom mi to nedá. Asi to sice v mém případě nepoužiju, ale trochu jsem se Vaší radou zabýval. Takže, pokud chci tímto způsobem spustit ten druhý formulář (stále pro jednoduchost vycházím z toho svého příkladu s Form1 a Form2) aby běhal v jiném threadu, je nutné ho "nějak zaměstnat", aby stále něco dělal - jinak se thread ukončí?. Není tedy možné, aby tento formulář pouze "čekal na událost" tak, jak se jeví stav normálního formuláře, který spustím přímo, případně metodou f.start() ve stejném vlákně? Předpokládám (ale chtěl bych to ověřit), že u takovéhoto formuláře ošetření zde vzniklých událostí běží ve stejném vlákně, v jakém je formulář spuštěn (tedy ne v tom původním, ze kterého byl spuštěn). Pokud bych chtěl Vaší konstrukce (se sleepem) využít, ale chtěl bych, aby mi formulář Form2 pracoval stejně, jako všechny jiné formuláře (reagoval na události atd.), kam tu "udržovací" smyčku nejlépe umístit?: zkoušel jsem 2 možné způsoby, které se navenek jevily podobně: 1) druhý formulář jsem spouštěl stejně jako v příkladu výše, tedy
thr = New System.Threading.Thread(AddressOf f.show)
thr.Start()
a do Form2 jsem dal "udržovací" smyčku do události me.activated, tedy:
Private Sub Form2_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
While Not konec
Threading.Thread.Sleep(100)
Application.DoEvents()
End While
End Sub
Druhý způsob, který mi (na základě vnějších znaků) fungoval stejně byl, že jsem do Form2 přidal další veřejnou metodu:
Public Sub pracuj()
Me.Show()
While Not konec
Threading.Thread.Sleep(100)
Application.DoEvents()
End While
End Sub
a celé to spouštěl z Form1:
thr = New System.Threading.Thread(AddressOf f.pracuj)
thr.Start()
. V obou případech se Form2 objevil, byl přístupný uživateli a reagoval na vlastní události (měnil barvu v rytmu časovače). Mé dotazy: 1) Je takový přístup možný, pokud ano, který z nich je lepší (u toho prvního si nejsem zcela jist, že jsem zvolil nejlepší metodu ošetření události, kam to dát - potřeboval bych tu skutečně poslední, která se vyvolá až po sestavení a vykreslení formuláře a, přiznám se, to nevím, která je) 2) A potvrzení - vyvolané události jsou asi taky ošetřovány v mém "vedlejším" vláknu "thr" - asi jo, protože nejsou problémy s přístupem k vlastnostem samotného formuláře, ale přece jenom si to nechám od odborníků potvrdit. Jinak ale by se tato Vaše konstrukce dost blížila mým původním požadavkům na chování aplikace, jediné rozpaky mám nad tím sleepem - jak se odrazí na celkové výkonnosti - ale ostatní vlákna by snad nijak (výrazně) ovlivňovat neměl a při vykonávání výkonově náročných operací v rámci mého Form2 by asi nebyl velký problém na tuto dobu ten udržovací cyklus přerušit a nahradit cyklem, který bude provádět právě ty "náročné" operace. Nebo se (opět) mýlím? Ještě jednou dík.
|