Zjištění běhu aplikace   otázka

VB.NET, WinForms

Ahoj všichni, jsem začátečník, ale základy okolo textu, atp. už umím ...

Potřeboval bych pomoc s jednou aplikací, ve které zjišťuju zda je program zapnutý nebo vypnutý a aby se to aktualizovalo po 5 sekundách.

Udělal jsem toto:

    Dim server_proces As Process = Nothing

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            server_proces = Process.Start("notepad.exe")
            Do
                If Not server_proces.HasExited Then
                    For i As Integer = 0 To 1000000000
                        server_proces.Refresh()
                        If server_proces.Responding Then
                            Label2.Text = "Bezi"
                        Else
                            Label2.Text = "Nebezi"
                        End If

                    Next i
                End If
            Loop While Not server_proces.WaitForExit(1000)

    End Sub

Ale je tu chyba, že se spustí jako první poznámkový blok a po vypnutí bloku se spustí program, kde bude stejně napsáno běží :(

...

Potřeboval bych to udělat tak, že se jako první spustí program a pak se zjistí zda proces běží a podle toho to vypíše do programu zda běží nebo ne a aby se to zaktualizovávalo po 5 sekundách ...

Už jsem zkoušel všechno možný a stejně nic :( Už se stím trápím pomalu 2 dny :(

Nemusí to být celý script, stačí něco co mě pošle na sprvánou cestu.

Předem všem díky za pomoc :)

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

Už to mám vyřešeny ...

        server_proces = Process.Start("notepad.exe")

        Dim iss As Integer
        For iss = 0 To 1000000000
            server_proces.Refresh()
            If server_proces.HasExited Then
                Label2.Text = "Nebezi"
            Else
                Label2.Text = "Bezi"
            End If

            Application.DoEvents()
        Next iss

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

Určitě nepouživejte smyčku For pro tuto úlohu. Ta Vaše smyčka musí neskutečně zatěžovat procesor. Také musí jednou skončit, což znamená, že po době přestane býti učinná. Dále neřeší, pokud byl notepad spuštěn jinak než v kódu tak to Vaše událost nezaznamená.

Nevím k čemu to má přesně sloužit, ale navrhuji následující řešení.

1. Pokud chcete, aby se notepad spustil automaticky ale jen jednou tak jej dejte do příslušné události např. Form.load

2.Použijte control "Timer" Nezapomeňte ho aktivovat (Enabled) a nastavte interval na Vámi požadovaných 5000 ms

3.Vytvořte událost tick pro Timer

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Process.Start("notepad.exe")
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label2.Text = "Nebezi"
        For Each Proc As Process In Process.GetProcesses()
            If Proc.ProcessName = "notepad" Then
                Label2.Text = "Bezi"
                Exit For
            End If
        Next
    End Sub

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

Ještě jsem to trochu vylepšil pomocí LINQ

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Dim IsRun As Boolean = (From P In Process.GetProcesses _
                                Where P.ProcessName = "notepad").Any
If IsRun Then Label2.Text = "Bezi" Else Label2.Text = "Nebezi"
End Sub

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

nebo ještě jednodušeji :-)

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If (From P In Process.GetProcesses Where P.ProcessName = "notepad").Any Then Label2.Text = "Bezi" Else Label2.Text = "Nebezi"
End Sub

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

Pokud už se tady chcete předvádět, jak to co nejvíc zjednodušit, tak co třeba:

Label1.Text = If(Process.GetProcesses().Any(Function(p) p.ProcessName = "notepad"), "Běží", "Neběží")

Nutno podotknout, že v C# se lambda funkce nezapisují tak strašně jako ve VB.

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

Nemá být místo If IIf?

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

Ne, IIf je funkce a If je operátor - je to alternativa k ternárnímu operátoru a k operátoru ?? v C#.

If na rozdíl od IIf nevyhodnocuje druhý a třetí parametr vždy, ale jen když je to potřeba, takže je možné použít ho třeba na konstrukce If(a Is Nothing, "0", a.Value), která by u IIf pochopitelně spadla na NullReferenceException.

Navíc se dá volat i se dvěma parametry:

If(a, b, c)    ...    a ? b : c
If(a, b)       ...    a ?? b

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

Zajímavé, o tom jsem ani nevěděl. Je to tak trochu jako And a AndAlso, kde u AndAlso se nevyhodnocuje druhá podmínka pokud první není splněna.

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

Ono to tam není zas tak dlouho, tuším to přibylo až Visual Basic 9 spolu s LINQ, lambdami a dalšími fíčurami.

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

hmm, dobrý, to mě nenapadlo. Asi by to šlo i bez té funkce, přijde mi to méně přehledné ?

A nechtěl jsem se předvádět, spíš pomoci. Stejně by mě zajímalo, jestli první metoda přes smyčku je v reálu pomalejší než přes Linq nebo je to defacto to samé, jen s jednoduší syntaxí ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
From a In b Where a.c = e Select a.d

je jen syntax sugar, vnitřně se to převádí na něco jako

b.Where(Function(a) a.c = e).Select(Function(a) a.d)

,

takže rychlé to bude zhruba stejně.

Navíc u tohoto příkladu, kdy procházíte kolekci řádově desítek objektů, je to naprosto zanedbatelný rozdíl.

Obecně For cyklus je o trošku rychlejší než For Each a ten je o trošku rychlejší než LINQ. Ale poznáte to až u desítek tisíc, možná stovek tisíc objektů.

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

A je obecně lepší si v našem případě řetězec "notepad" nejdříve deklarovat jako proměnnou ?

Jde mi o to, zda se tím ušetří čas na naplnění paměti při každém průchodu ?

A ještě jeden dotaz, existuje nějaký způsob jak při deklaraci proměnné typu string určit jeho pevnou velikost jako tomu bylo u VB6 ? Pokud ne, není to plýtvání pamětí ?

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

Moc díky všem.

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