Čekání aplikace   zodpovězená otázka

VB.NET

Zdravím,

mám asi fakt amatérský dotaz, ale opravdu jsem nikde moc nenašel odpověď. Žádná kniha, kterou jsem doposud četl se tímhle nezabývala.

Mám aplikaci bez formuláře, která čeká na vyhotovení určitých dat (např. čeká až se objeví určitý soubor). Ale vždy to zabere nějaký čas. Jakým nejlepším způsobem se zajistí ono čekání, aby aplikace nezabírala - pokud možno - žádný CPU workload? Zatím mně napadá "nekonečná" smyčka s tím že tam vložím Sleep() a kontroluji každou sekundu, např?

Moc dík.

P.

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

Myslím si, že by bylo lepší použít Timer.

Víťa

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

Uplně nejlepší je zajistit, aby Vám komponenta na kterou čekáte dala vědět že už dokončila svojí práci - např. pomocí Eventu (události). Ne vždy to je však možné.

Pokud to nejde jinak, ta bych to řešil pomocí timeru (ne sleep) a v jiném vlákně (i když možná tick timeru běží v samostatném vlákně defaultně, tím si ale nejsem jistý). A taky bych to asi nespouštěl každou sekundu ale třeba jednou za pár minut. Nebo Vy potřebujete mít z nějákého důvodu okamžitou odezvu o dokončení předchozí operace?

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

moc dík. Okamžitá reakce je potřebná. Ono to nebude v minutách, ale spíše v sekundách.

Chápu nasazení timeru i eventu, ale jak pozastavím aplikaci a řeknu ji, teď nic nedělej a čekej na event (nebo timer)? Nabízí se skrýt nějaký formulář, ale to se mi nezdá elegantní.

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

Něco jako tento kód, ale během té smyčky bych rád odlehčil CPU a nějak mu řekl, nedělej nic do doby něž bude potřeba. (timer nebo event by mi nastavil Done proměnnou...)

My.Application.DoEvents()
Do While Not Done
  My.Application.DoEvents()
Loop

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

Takhle rozhodně ne!

Existují dva typy čekání - aktivní a pasivní. Aktivní čekání je velmi často špatné, náročné na systémové zdroje a téměř vždy se mu snažíme vyhnout. Aktivní čekání funguje tak, že se jednou za čas probudíme, zjistíme, co se děje, a zase se na chvíli uspíme. Nevýhody jsou jasné - nikdy neurčíte interval zjišťování přesně - buď je moc krátký, tím pádem se budíte moc často a zatěžujete procesor, anebo je moc dlouhý, takže se změna zjistí dost dlouho po tom, co sledovaná událost nastane.

Pasivní čekání funguje tak, že vlákno uspíte a necháte si vyhodit událost, že se daná věc stala. Pokud to jde, je to daleko lepší řešení.

Pokud čekáte na změny v souborovém systému, použijte komponentu FileSystemWatcher. Rozhodně ne Timer.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Zdravim, dobra uvaha, ale jak to obejit ?

Jak nahradit Timer ? pokud potřebuji toto:

       Do While CheckBox1.Checked

'nejaky kod a pak prodleva podle NumericUpDown1.Value = 1 (1 sec, nebo se da zvetsovat)

            Timer1.Interval = CInt(NumericUpDown1.Value) * 1000
            Timer1.Enabled = True
            Timer1.Start()
            Do While ProgressBar1.Value < ProgressBar1.Maximum
                My.Application.DoEvents() 'pokud to nedam, nejde CheckBox1.Checked prepnout
            Loop
            ProgressBar1.Value = 0
        Loop

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        ProgressBar1.Value += 1
        If ProgressBar1.Value >= 60 Then
            Timer1.Enabled = False
        End If
    End Sub

CPU mi jede na 50% a pamet je na 60 MB.

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

A zase DoEvents... Zapomeňte všichni že existuje nějaké DoEvents. Pokud používáte konzolovou aplikaci tak zde neběží žádná smyčka zpráv jako ve Windows Forms aplikaci, tudíž to stejně nemá smysl. Ideální řešení je použít FileSystemWatcher, nebo pokud to druhá strana podporuje, meziprocesovou komunikaci (semafory, wait handle, apod.).

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

Zde je velmi hezky vysvětleno,

proč se vyhýbat DoEvents

Keeping your UI Responsive and the Dangers of Application.DoEvents

http://blogs.msdn.com/jfoscoding/archive...

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