Timer - událost Tick   zodpovězená otázka

VB.NET, Architektura

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.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stačilo by použít jediný Timer který by aktualizoval jak stopky, tak data (pro data by se po uplynutí určitého času spustilo načítání ve vlastním vlákně, což by nebrzdilo stopky).

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nápad je to dobrý, ale v tomto konkrétním případě nevím jak bych jej realizoval, protože tato aplikace má dvě formulářové třídy resp. objekty, které používám ještě v dalších dvou aplikacích jednotlivě.

Bohužel nemám s prací s vlákny skoro žádné zkušenosti, navíc jsem se domníval, že každý formulář běží tak jako tak ve vlastním vlákně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No nevím přesně jaký čas ten label zobrazuje, ale pokud jde o nějaký fixní čas od nějakého místa dále, asi bude nejjednodušší použít TimeSpan a z něj počítat při každém aktivování timeru jeho rozdílovou hodnotu. takže asi něco jako tohle:

Public tm as DateTime 
Public Sub Form_load
     tm = Now()'Od tohoto okamžiku měříme uplynulý čas
End Sub
Public Sub Timer1_Tick
     Dim ts as TimeSpan
     ts = now.Substract(tm)
     Label1.Text = ts.Minutes.ToString("00") & ":" & ts.Seconds.ToString("00")
End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Běží, nazývá se hlavní vlákno a běží v něm tzv. smyčka zpráv, což je srdce každé Windows aplikace. Právě proto když toto vlákno zatížíte zbytečnostmi, potom se trhá nebo zamrzá uživatelské rozhraní (nedostává se čas na pumpování zpráv).

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Pánové, oběma Vám děkuji za cenné informace.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback