Na začátečníky nemůžete hned vybafnout vlákna, to by se do toho úplně zamotali. Je pravda, že DoEvents zpomaluje a nemělo by se používat, ale úplným začátečníkům ho prozradit můžeme. Až budou umět programovat lépe, naučí se vlákna.
Dim zastavit As Boolean = False
Public Sub CasoveNarocnaProcedura()
zastavit = False
While podmínka
Application.DoEvents() 'zpracuje události
If zastavit Then Exit While 'pokud je příkaz pro zastavení, vypadnout z cyklu
End While
End Sub
Public Sub Button1_Click(sender As Object, e As EventArgs)
zastavit = True
End Sub
Jak psal kolega Linhart, toto řešení není vhodné používat v profesionálních aplikacích, nicméně začátečníkům bude stačit. Události tlačítek ani jiných komponent se nemůžou zpracovat, pokud se zrovna zpracovává nějaká jiná událost, tak, jak události nastávají, řadí se do fronty a zpracovávají se postupně. Když máme nějakou událost, která se zpracovává dlouho, můžeme uvnitř zavolat Application.DoEvents, což způsobí, že se v daný okamžik zpracují všechny události, které čekají ve frontě za touto událostí, a pak se pokračuje dál. Díky tomu se nestane, že kliknutí na tlačítko aplikaci zasekne, ale událost se normálně zpracuje. Vhodnější je použít vlákna, toto řešení není čisté, Application.DoEvents má poměrně velkou řežii a při extrémně častém volání zpomaluje.
|