Většinou se v takových případech dá pro vložení doevents() využít vhodného místa v programu (často se právě pro tabulkové výpočty používá různých vnořených cyklů: zpracováváte postupně řádky (vnější cyklus) a v každém řádku postupně sloupce (vnitřní cyklus), pak je dobré doevents umisťovat do toho vnějšího cyklu (stejně jako změna stavu Vámi zmiňovaného progressbaru je málokdy potřebná po každé spočítané buňce, protože to představuje stejné zdržení). Ale po přečtení příspěvku pana Hercega mne zajímalo, jaký vliv na výkonnost bude mít to, že, protože zde nemáme vnořených cyklů a samotný příkaz cyklu je velice rychlý, spouštíme doevents() na základě testu if. Naše aplikace totiž sice v každém průchodu nemusí volat doevents(), ale zato musí testovat podmínku IF. Pro ty, které to zajímá, uvádím výsledky: testovací smyčky vypadaly následovně:
Public Class Form1
Dim a As Long
Dim mez As Long = 1000000
Dim cas As DateTime
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
a = 0
cas = Now
For i As Long = 0 To mez
a += 1
Next
Label1.Text = Now.Subtract(cas).ToString
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
a = 0
cas = Now
For i As Long = 0 To mez
a += 1
Application.DoEvents()
Next
Label2.Text = Now.Subtract(cas).ToString
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
a = 0
cas = Now
For i As Long = 0 To mez
a += 1
If i Mod 1000 = 0 Then Application.DoEvents()
Next
Label3.Text = Now.Subtract(cas).ToString
End Sub
End Class
a výsledky: - pro čistou smyčku (pod Button1) celkový čas 0,016 s - pro smyčku se soustavným voláním doevents (pod Button2) čas 22,7 s - pro smyčku s podmíněným voláním doevents(pod Button3) čas 0,031 s Pokud ale celou aplikaci zkompiluji, pak jsou výsledky "trošičku" rozdílné a to tak, že: - dle button 1 je čas tímto způsobem zjištěný pod hranicí přesnosti měření - dle button 3 se mi pohybuje na této hraníci (kolem 0,016 s, což je asi nejmenší rozlišení tohoto způsobu měření času) - dle BUTTON 2 jsem pak dosáhl celkového času 1,06 s Prosím čtenáře, ať si každý udělá svůj obrázek o použitelnosti jednotlivých přístupů
|