[VB.NET] ShowDialog() asynchroon maken

Pagina: 1
Acties:

  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 17-02 18:52
In mijn applicatie zit enkele langdurige (in eigen thread) bewerkingen. Bij elke lange operatie komt er een "pop-up" scherm tevoorschijn welke aangeeft wat er op dat moment gebeurd. Deze wordt geupdate door de thread zelf.
Op het moment dat de bewerking bezig is mag de gebruiker nergens op klikken.
Met ShowDialog() wordt de "pop-up" op de voorgrond gezet en kan het parentform de focus niet meer krijgen. Alleen is ShowDialog() een blocking functie dus is de popup niet meer aan te passen (vanuit de thread die hem maakt).
Nou is er natuurlijk de mogelijkheid om de popup te laten zien met Show() en dan het parentform te disablen. Maar op het parentform staan weer een partij controls die dan allemaal grijs moeten worden en dat resulteert in een hoop geknipper etc.
Is er een manier om te doen wat ShowDialog() doet, maar dan asynchroon?

  • whoami
  • Registratie: December 2000
  • Laatst online: 19-02 23:53
ShowDialog mag je niet oproepen vanuit een andere thread dan de UI thread.

Als het je bedoeling is om te tonen waar de thread nu mee bezig is, waarom doe je dat dan mbhv een popup ? Waarom ga je gewoon de status niet ergens in een label ofzo wegschrijven. (Ook wel oppassen dat het thread-safe gebeurt, maw, dat je de UI thread invoked om dat label aan te passen).

https://fgheysels.github.io/


  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 17-02 18:52
In mijn geval is het toch iets anders denk ik.
Even wat meer informatie: Zodra het programma wordt gestart wordt er een thread gecreërd welke constant "zoekt" naar een USB device. Het programma is te gebruiken met, en zonder, dat device. Als het device is aangesloten worden sommige delen, op meerdere schermen realtime aangepast. Als het device wordt aangesloten vind er eerst een datauitwisseling plaats (+-4 seconden). Het maakt dus niet uit in welk scherm je zit. Er komt altijd een popup die je verteld dat het apparaat is gevonden en die de form die op dat moment active is even "in de wacht zet".
Doordat ik niet weet welk form (of welke Tab) er wordt getoond kan ik dus niet ergens een label zetten (en doe ik het dus met een popup).
Alleen gaat dat dus niet helemaal goed. Ik hoop dat dit het één en ander iets verduidelijkt.

  • whoami
  • Registratie: December 2000
  • Laatst online: 19-02 23:53
Je thread mag zowiezo geen form openen.
Maak een class volgens het Task pattern. Die class heeft een method run, die de functionaliteit start op een aparte thread. Als er een aparaat gevonden wordt, kan je een event raisen.
Je client programma, dat dus die class gebruikt, kan zich abonneren op die event, en, de gepaste actie ondernemen. (Bv een pop-up tonen).

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 19-02 14:18

pjvandesande

GC.Collect(head);

Je kunt toch een event de lucht in gooien zodra er een device is gevonden en dit event in je Parent form handlen. In die handling method roep je dan de ShowDialog aan. Want je class die checked voor devices heeft niks me maken met je UI, dit zou je gescheiden moeten houden.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 14:43

mulder

ik spuug op het trottoir

Wil je niet een form niet gewoon AlwaysOnTop(float) showen.

oogjes open, snaveltjes dicht


  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 17-02 18:52
questa schreef op woensdag 21 juni 2006 @ 18:36:
Je kunt toch een event de lucht in gooien zodra er een device is gevonden en dit event in je Parent form handlen. In die handling method roep je dan de ShowDialog aan. Want je class die checked voor devices heeft niks me maken met je UI, dit zou je gescheiden moeten houden.
Eigenlijk gebeurt dat nu al. Alleen niet in de parent form (want er kunnen meerdere forms geopend zijn). Er is één klasse welke gemaakt wordt wanneer de applicatie start. Dit is een soort controller klasse. Methodes in deze klasse zijn geabonneerd op de events die uit de Device klasse komen. Deze klasse laat dus ook het pop-up form zien.
Doordat er meerdere forms zijn kan ik niet de events in alleen een parentform handlen. Ik will eigenlijk alles op slot zetten en één dialog de status laten weergeven (de dialog weet dus niet wat er gebeurt, dus kan niet zelf de status updaten). Het kan wel, ik moet dan het actieve form op enabled=false zetten, maar dan krijg ik een complete repaint van alles controls (duurt lang en knippert). Hoe heeft Microsoft het gedaan met ShowDialog()? Daar worden wel alle forms "gelocked" en de dialog op de voorgrond gezet. Is dat een speciale API call?
Don Facundo schreef op donderdag 22 juni 2006 @ 08:53:
Wil je niet een form niet gewoon AlwaysOnTop(float) showen.
Inderdaad ook geprobeerd, maar het onderliggende form is dan nog gewoon clickable.

[ Voor 10% gewijzigd door CodeIT op 22-06-2006 09:11 ]

Pagina: 1