Zdravím. V desktopové aplikaci ve VB2005 EE si ve formuáři vytvořím objekt typu System.Windows.Forms.Timer a v jeho události Tick si zvyšuji čas na stopkách - měním text na labelu. Z tohoto formuláře mám v události Load ještě otevřený druhý formulář s objektem DataGridView a v něm dalším timerem (po 3 sekundách) periodicky zjišťuji, zda nastala nějaká změna v podkladové databázi. Pokud ano, tak do mřížky načtu aktuální data metodou DataAdapter.Fill. Tato operace vždy nějaký čas trvá (v praxi 0,1-3 sekundy) a stopky na prvním formuláři po tu dobu neběží. To mi vůbec nevadí (čas je jen orientační), ale potřeboval bych, aby v okamžiku, kdy načtení dat je hotovo se čas srovnal na správnou hodnotu. Empiricky jsem ověřil, že Timer čas "dohoní", pokud aktualizace netrvá déle jak jednu sekundu. Je-li tento čas delší, stopky se zpozdí o příslušný počet sekund (-1), po které trvala aktualizace. Zatím jsem to obešel tak, že si v události Tick vždy zapamatuju hodnotu My.Computer.Clock.TickCount a při dalším Ticku jí porovnám s tou předchozí a pokud je rozdíl větší než cca 1500 ms, tak funkci pro změnu textu na labelu zavolám v daném Ticku v cyklu tolikrát, abych čas srovnal. Funguje to, ale očekávám, že toto řešení bude po právu nazváno prasárnou a že musí existovat něco šikovnějšího (priorita vlákna nebo objekt System.Threading.Timer apod.) Podotýkám, že odpočítávaný čas je pouze orientační a důležitější je, aby proběhla řádně aktualizace mřížky na druhém formuláři.
|