For Each cez Timers   zodpovězená otázka

VB.NET

Dobrý deň ,snažím sa vytvoriť cyklus for each ,ktorý prejde všetky Timeri a zistí či bežia. Skúšam to rôzne ,ale neviem nato prísť.

Viete mi poradiť ?

Dakujem

nahlásit spamnahlásit spam 0 odpovědětodpovědět
For each o As object in me.controls
   If typeof(o) is timer then
       Dim t As timer = directcast(o,timer)
            If t.enable then
                'něco
             End if
        End if
Next

Pišu na mobilu / neověřeno

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

Nerád to píšem ,ale kód nefunguje (teda ak som nespravil niekde chybu ja)

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = True
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Timer2.Enabled = True
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Timer3.Enabled = True
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        For Each o As Object In Me.Controls
            If TypeOf (o) Is Timer Then
                Dim t As Timer = DirectCast(o, Timer)
                MsgBox("test")
                If t.Enabled Then
                    MsgBox("test")
                    'TextBox1.AppendText(vbNewLine + t.Tag)
                End If
            End If
        Next
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text += 1
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Label1.Text += 1
    End Sub

    Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        Label1.Text += 1
    End Sub
End Class

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

Ještě aby to fungovalo, když tam cpete takovou zhovadělost jako Label1.Text += 1...

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

Ale áno, to čo ste mi vytkol splňa to čo som čakal .. skôr ide oto ,že nefunguje toto :

For Each o As Object In Me.Controls
            If TypeOf (o) Is Timer Then
                Dim t As Timer = DirectCast(o, Timer)
                MsgBox("test")
                If t.Enabled Then
                    MsgBox("test")
                    'TextBox1.AppendText(vbNewLine + t.Tag)
                End If
            End If
        Next

teda v My.Controls nenájde Timer.

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

Píšu to z mobilu a tak nemohu ověřit. Do horní části kódu vlož

Public Timers As New List (Of Timer)

Do události Form Load dej

Timers.Add(Timer1)
Timers.Add(Timer2)
...

A tam kde se to má zjišťovat dej

For Each tim As Timer In Timers
If tim.Enabled = True Then
'Příkazy
End If
Next

Snad pomohlo.

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

Naprosto zbytečné a nesmyslné, pro komponenty existuje kolekce Components.

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

Zkuste změnit Me.Controls na Form1.Controls (pokud jsou umístněny na Form1)

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

Na instančního člena třídy se odkazovat staticky je naprostá prasárna, divím se, že to ve VB 10.0 ještě nezakázali. Nedělat to tak.

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

Timer a podobné nevizuální komponenty se neumisťují do kolekce Controls, ale Components. Takže Me.Controls nahraďte za Me.components.Components.

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

Dakujem všetkým za snahu pomôcť mi. A musím povedať že pán Ondřej Linhart je naozaj vzdelaný po tejto stránke ,lebo ako vidím vie vyriešiť každý problém :-)

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

Dobrý večer,

snad si to někdo přečte a pomůže.

Ve VB6 jsem měl fungující aplikaci, ve které uživatel zapsal název televizního pořadu, čas spuštení, dobu trvání, atď - prostze nějakou událost.

Řešil jsem to pomocí komponent Listview a Timer.

Při zápisu "nové události" na řádek Listview jsem pokaždé vytvořil další timer - (timer(0), timer(1), timer(2), atd.

Do vlastnosti Tag jsem si uložil nějakou identifikaci ze zadaných údajů a pak jsem přesně věděl, který timer co zpracovává, jestli už skončil, atd.

Ve VB.NET klasicky indexované komponenty patrně nejsou.

Zkusil jsem to přes definici:

Dim tmrTask(23) As System.Windows.Forms.Timer
Dim idxTimer As Integer = 0

Pak po zadání úkolu spustím nový timer v proceduře:

private sub Nastaveni()
ReDim tmrTask(idxTimer)
tmrTask(idxTimer) = New System.Windows.Forms.Timer
tmrTask(idxTimer).Interval = NejakaHodnota
tmrTask(idxTimer).Tag = idxTimer
tmrTask(idxTimer).Enabled = True
AddHandler tmrTask(idxTimer).Tick, AddressOf tmrTaskTick
tmrTask(idxTimer).Start()
idxTimer += 1
end sub

V proceduře zupracování události tmrTaskTick pak:

Private Sub tmrTaskTick(ByVal sender As Object, _
    ByVal e As System.EventArgs)
        Dim timr As Timer = DirectCast(sender, Timer)
        Dim i As Integer
    
        timr.Enabled = False
        timr.Stop()

        For i = 0 To lvRECORDS.Items.Count - 1
          If timr.Tag = lvRECORDS.Items(i).SubItems(15).Text then              
                SpusteniDefinovaneAkce  'volám proceduru      
          End If
        Next
    End Sub

Pokud je v seynamu ukolu jeden timer, tak funguje perfektně. Jakmile je tam ale více řádku a volají se další timery, nefunguje to korektně.

Poradíte?

Díky moc.

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

Člověk prostě musí zkoušet... :)

Stačilo v proceduře tmrTaskTick vypustit příkaz timr.Stop()

Všechny timery se korektně spustili.

A protože by bylo zvláštní, aby to VŠECHNO pak fungovalo, nefunguje ošetření procesu, kterým spouštím definovanou událost.

V deklaraci mám:

 WithEvents myProcess As New System.Diagnostics.Process

V proceduře spuštění pak:

Dim ProcesID As Object
myProcess.StartInfo.FileName=NejakaAplikace.Exe
myProcess.StartInfo.Arguments=NejakeArgumenty
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal
myProcess.EnableRaisingEvents = True
AddHandler myProcess.Exited, AddressOf Me.KonecNahravky myProcess.Start()

V proceduře pro indikaci ukončení procesu pak:

 Private Sub KonecNahravky(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyProcess.Exited       

        If Me.InvokeRequired() Then
            Dim dr As New KonecNahravkyDelegate(AddressOf KoniecNahravky)
            Try
                Me.Invoke(dr, myProcess.Id) '', e)
            Catch
            End Try
        else
        KonecNahravky (myProcess.Id)
        End If

Pak nasleduje Delegate - nevim, jestli je to OK

 Delegate Sub KonecNahravkyDelegate(ByVal IDprocesu] as Integer)
    Private Sub KonecNahravky(ByVal [IDprocesu] As Integer)
        Dim i As Integer       
        For i = 0 To lvRECORDS.Items.Count -1         
            If IDprocesu = lvRECORDS.Items(i).SubItems(16).Text And lvRECORDS.Items(i).SubItems(11).Text = "NAHRAVAM" Then
  Me.lvRECORDS.Items(i).SubItems(11).Text = "OK" 
  Me.lvRECORDS.Items(i).SubItems(16).Text = ""            
            End If
        Next
    End Sub

A abych specifikoval konkrétní problém v tomto stádiu:

Proces ohlásí svůj konec (resp.provede zápis do listView /lvRECORDS/) jenom jednou.

Pokud první proces ještě běží a spustí se další, tak svůj konec indikuje až ten druhý.

Zajímavé je, že pak jsem měl načasované další dva procesy, které šli po sobě, ale indikace nenastala ani u jedného z nich.

Nějaký nápad?

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