2011-01-23 8 views
58

Mam formularz, który przechodzi przez nieskończoną pętlę i przetwarza dane. Po kliknięciu przycisku, który "zamyka" formularz, formularz kontynuuje przetwarzanie, mimo że jest zamknięty. Chcę, aby formularz całkowicie się zakończył i wyjdzie z jego deklaracji pętli, a następnie otwórz nowy formularz.VB.NET - pętla postaci przerwań i formularz końcowy

Oto kod używam, aby zamknąć formularz

frmMain.Close() 
frmMain.Dispose() 

Uwaga: Nie używam wątki to tylko prosty VB.NET aplikacji. Nie zamykam głównego formularza startowego.

Odpowiedz

82

"Prawidłowy" sposób to jest z wątkami pracującymi w tle. Ale działa to również bez potrzeby wątków pracującego w tle.

Zadeklaruj zmienną w klasie formularza.

Private keepLoopAlive As Boolean 

Następnie napisać pętlę przetwarzania być coś takiego:

keepLoopAlive = True 

Do While keepLoopAlive 

    (your code that loops here) 

    DoEvents 

Loop 

Następnie na Close przypadku zrobić:

keepLoopAlive = False 
Me.Close() 

To spowoduje, że pętla do końca pierwszej szansy nie może, a twój formularz powinien się zamknąć.

Uwaga: Napisałem ten kod z pamięci, a nie z IDE, więc mogą występować literówki.

+1

Dzięki! Zakończyłem wdrażanie tego do mojego programu i działa świetnie! Pierwotnie pytałem, czy mogę nagle zakończyć proces formowania bez konieczności konkretnego wyjścia z pętli, ale brzmi to tak, jak nie jest to możliwe. – Phil

+1

Możesz zakończyć proces bez zabijania pętli. Istnieją co najmniej trzy proste sposoby w .Net: ustaw "IsBackground" na wątku na "true", a następnie zakończ wszystkie wątki pierwszoplanowe lub wywołaj Environment.FailFast() lub Environment.Exit(). – codekaizen

+43

Dla wszystkich pracowników Google: należy pamiętać, że właściwym sposobem jest użycie pracownika w tle. –

11

Nie jestem programistą .NET, więc może to nie być poprawne, ale gdybym wykonywał nieskończoną pętlę, sprawdzałbym za każdym razem, gdy zaczynałem, że pętla była nadal poprawna z jakąś wartością boolowską, i jeśli jest nie powiodło się, zrezygnuj z pętli.

Po zamknięciu formularza należy ustawić wartość logiczną "false", która zostanie usunięta i można mieć zewnętrzną pętlę, która czeka i uruchamia ponownie pętlę lub można ponownie uruchomić całą funkcję w innym czasie.