Toon posts:

[VB.net] multithreading in VB.net of een timertick? *

Pagina: 1
Acties:
  • 294 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
hey

in VB.net ben ik dus bezig met een looplicht in de vorm van
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        pControl.setPin(0, True)
        pControl.setPin(0, False)
        pControl.setPin(1, True)
        pControl.setPin(1, False)
        pControl.setPin(2, True)
        pControl.setPin(2, False)
        pControl.setPin(3, True)
        pControl.setPin(3, False)
        pControl.setPin(4, True)
        pControl.setPin(4, False)
        pControl.setPin(5, True)
        pControl.setPin(5, False)
        pControl.setPin(6, True)
        pControl.setPin(6, False)
        pControl.setPin(7, True)
        pControl.setPin(7, False)

Nu is het de bedoeling dat hij tussen de 0 waarde true en false 2 sec pauzeert, tussen de 1 waarde true en false 2 sec, etc.

Nu weet ik dat het mogelijk is om via
code:
1
threading.thread.sleep(2000)

een thread te laten inslapen, en ook via multithreading. Maar multithreading lukt me niet zo goed.

nu heb ik iets gehoord van een timer.tick die samenwerkt met interval. dat heb ik intussen dus ook al geprobeerd dus terwijl bij m'n knop stond timer.interval=2000 stond bij m'n timer 9 keer
addhandler timer.tick, adressof timer1_tick . maar hij negeerde die code gewoon en deed het hele looplicht in 1msec . heeft iemand hier een oplossing voor? ik heb al verschillende google searches en GoT searches geprobeerd, maar die leveren niets op.

edit: typo

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Zestien regels code voor een looplicht van 8 lampjes? Dat kan korter. ;) Ik zou als volgt een thread functie maken, al weet ik niet hoe dat in VB precies geïmplementeerd wordt.

Visual Basic:
1
2
3
4
5
6
7
8
Dim teller as Integer
teller = 0
While true Do
    pControl.setPin(teller, true)
    Threading.Thread.Sleep(2000)
    pControl.setPin(teller, false)
    teller = teller + 1
End While

Je zegt ook dat threads maken niet lukt, kun je zeggen waar je op vastloopt?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
wel, hij zegt dat je iets moet doen met een class ofzo, dat vind ik niet echt ( srr, me -> supern00b )

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Misschien heb je wat aan deze twee pagina's:
http://www.dotnetbips.com/displayarticle.aspx?id=126
http://www.informit.com/g...t.asp?g=dotnet&seqNum=199
Deze sites gaan niet specifiek over VB.NET, maar je moet hier waarschijnlijk wel uit kunnen halen wat je nodig hebt. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Farmerwood
  • Registratie: September 2004
  • Niet online
-NMe- schreef op zaterdag 11 december 2004 @ 00:41:
Zestien regels code voor een looplicht van 8 lampjes? Dat kan korter. ;) Ik zou als volgt een thread functie maken, al weet ik niet hoe dat in VB precies geïmplementeerd wordt.

Visual Basic:
1
2
3
4
5
6
7
8
Dim teller as Integer
teller = 0
While true Do
    pControl.setPin(teller, true)
    Threading.Thread.Sleep(2000)
    pControl.setPin(teller, false)
    teller = teller + 1
End While
Jij hebt een onbeperkt aantal ledjes ofzo ;)

//Qhead
Jij hebt waarschijnlijk die hele code zo in de timer gezet?
Dan loopt hij dus elke 2 sec dat rijtje af en gaat het idd in ong 1 ms.
Als je een timer wilt gebruiken zul je ook een globale variabele moeten gebruiken die je in de timer steeds 1 ophoogt tot de max en dan weer op 0 zet.

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45

SilentStorm

z.o.z

Jij hebt een onbeperkt aantal ledjes ofzo ;)
dan gebruik je toch
code:
1
teller = teller +1 % 20
(bij 20 lampjes -- uitgaande van mod (modulo als # in VB) :)

Voor varianten van het slapen zou je de help even moeten doorlopen, waarschijnlijk is er wel een versie het wel doet zoals jij het wilt. Volgens oa deze site, zou gewoon 'sleep' voldoende moeten zijn voor 1 thread. Ik heb verder geen vb ervaring, dus ik wil je toch die help aanraden :)

[ Voor 3% gewijzigd door SilentStorm op 11-12-2004 12:19 ]

Localhost is where the heart is


Verwijderd

Topicstarter
ik heb de code van NMe even aangepast en kwam uiteindelijk uit op dit :
code:
1
2
3
4
5
6
7
8
9
10
Dim teller as Integer 
teller = 0 
While true Do 
    pControl.setPin(teller, true) 
    Threading.Thread.Sleep(2000) 
    pControl.setPin(teller, false) 
    teller = teller + 1
loop until teller = 7 then
teller = 0 
End While


nu moet ik juist nog zien een timer.tick te verkrijgen :X
@ silentstorm: dat lukt niet in VB.net (name is not declared :p )

[ Voor 10% gewijzigd door Verwijderd op 11-12-2004 15:38 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:00
Een Timer Tick verkrijg je door je timer te enablen en het interval goed te zetten. Om de zoveel tijd krijg je dan een Tick event.

https://fgheysels.github.io/


Verwijderd

Topicstarter
de interval staat op 2000 ms( 2sec dus ), en de timer start zodra er op de knop geklikt wordt. maar toch heb ik 'n pause nodig tussen die true en false...

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Ik heb geen idee wat je in je timer tick voor code aanroept maar de ene keer zal je in die functie de pin op true moeten zetten, en de volgende tick (twee secdonen later) op false. Niet op true en false achter elkaar in 1 timer tick.

[ Voor 4% gewijzigd door Creepy op 11-12-2004 15:59 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
maar hoe laat ik dan mijn script weten dat hij dat moet doen op de 2e timer.tick ( je ziet : ik ken nog maar heel weinig van timers :( )

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Verwijderd schreef op zaterdag 11 december 2004 @ 16:05:
maar hoe laat ik dan mijn script weten dat hij dat moet doen op de 2e timer.tick ( je ziet : ik ken nog maar heel weinig van timers :( )
Je moet een timer maken met een interval van 2s, die de actuele uitgang toggled ( Outp = Not Outp )

Op het moment dat de uitgang wordt laag getoggled, hoog je een index op die de volgende aanwijst, ( mod OutputCount natuurlijk )

Op die manier heb je geen Sleep nodig, en ook geen tweede thread. Simpeler is beter, zolang je het maar niet _te_ simpel maakt. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
farlane schreef op zaterdag 11 december 2004 @ 16:27:
[...]


Je moet een timer maken met een interval van 2s, die de actuele uitgang toggled ( Outp = Not Outp )

Op het moment dat de uitgang wordt laag getoggled, hoog je een index op die de volgende aanwijst, ( mod OutputCount natuurlijk )

Op die manier heb je geen Sleep nodig, en ook geen tweede thread. Simpeler is beter, zolang je het maar niet _te_ simpel maakt. :)
ik wil niet vervelend doen hoor, maar hoe doe je dat dan(qua code, heb nog niet veel kennis kunnen halen uit boeken...) ?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Dat legt hij letterlijk uit. Zoek eens op "boolean operators" en bekijk met name de not operator eens. Deze maakt van true false, en van false true. Dus als je de waarde van een pin uitleest, en dan de not operator gebruikt en de waarde hiervan weer toekent aan diezelfde pin dan is deze van waarde veranderd.

zoals farlane al aangeeft: outp = not outp.

Of in jou geval iets als: pControl.setPin(teller, not pControl.getPin(teller) )

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
kijk daar snap ik nu geen worst van hmm

alles wat ik wil is een simpele onderbreking, moet je daarvoor beginnen met boolean operators enzo :? iets in de zelfde zin van threading.thread.sleep maar dan zonder dat het hele prog hangt |:( :X

Verwijderd

Misschien zoiets:

code:
1
2
3
4
5
6
7
8
9
10
11
12
while 1=1 do
For ActiefLedje = 1 to Aantalledjes
    For ledje = 1 to Aantalledjes
        if ledje = ActiefLedje then
                pControl.setPin(ledje , true) 
            else 
                pControl.setPin(ledje , false) 
        end if
    next
    system.Threading.Thread.CurrentThread.Sleep(2000)
next
end while

Verwijderd

Topicstarter
kijk dat is nu net hetgeen wat ik niet wil he

die threading.thread.sleep zorgt ervoor dat mijn hele prog hangt, en multithreading is bij mij ook niet zo suc6vol, dus zoek ik een makkelijke vervanger voor threading.thread.sleep die ervoor zorgt dat niet mijn hele prog vastloopt ;)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:45

gorgi_19

Kruimeltjes zijn weer op :9

Dan zal je toch met multithreading aan de gang moeten of de Timer Class moeten gebruiken en in diens callback eea moeten uitvoeren.

Sleep werkt perfect, maar zal je niet de actieve thread moeten laten slapen, maar een nieuwe background thread.

[ Voor 37% gewijzigd door gorgi_19 op 12-12-2004 18:18 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Als globale def. je dan

code:
1
Dim ActiefLedje as integer = 0


en in de event handler van de timer zet je:
code:
1
2
3
4
5
6
7
8
9
10
11
For ledje = 1 to Aantalledjes
        if ledje = ActiefLedje then
                   pControl.setPin(ledje , true) 
               else 
                   pControl.setPin(ledje , false) 
        end if
    next
ActiefLedje +=1
if ActiefLedje > AantalLedjes then
    ActiefLedje = 1
end if

  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 29-04 11:55
Multithreading hiervoor; zet in een class: (Import er natuurlijk boven)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Import System.Threading
......
Private LoopLichtThread as new Thread(AddressOf LoopLichtRun)
Private Sub LoopLichtRun
    While true
        For curLed = 0 to numLed - 1
            pControl.setPin(curLed,true)
            thread.sleep(2000)
            pControl.setPin(curLed,true)
        Next
    End While
End Sub
......


en dan ergens in een sub starten met:
code:
1
LoopLichtThread.Start()

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Verwijderd schreef op zondag 12 december 2004 @ 18:13:
kijk dat is nu net hetgeen wat ik niet wil he
Zoals ik al zei, een sleep is compleet overbodig. Maar als je het ongelooflijk simpele voorbeeld wat ik gaf al niet kunt implementeren ( en nog eens verder uitgekauwd door Creepy ), en je gewoon niet de moeite neemt om het uberhaupt te snappen ( waar is de code die je tot nu toe hebt? Hoe heb je mijn voorbeeld in elkaar gezet? ) hoef je van mij echt nix meer te verwachten. Laat eerst maar eens wat zien waaruit ik kan opmaken dat je er wat moeite voor wil doen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
farlane, ik respecteer het zeer veel dat je gereply-ed hebt op m'n vraag, en het principe snap ik wel: als hij true is moet hij op false gezet worden en als hij false is wordt hij naar true gezet.

maar ik weet enkel niet waar ik met die not operator naartoe moet :? aan mijn code is nog niets veranderd momenteel.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Verwijderd schreef op zondag 12 december 2004 @ 20:44:
farlane, ik respecteer het zeer veel dat je gereply-ed hebt op m'n vraag, en het principe snap ik wel: als hij true is moet hij op false gezet worden en als hij false is wordt hij naar true gezet.
Dat waardeer ik natuurlijk zeer. :)
maar ik weet enkel niet waar ik met die not operator naartoe moet :? aan mijn code is nog niets veranderd momenteel.
Heb je de help er al bij gepakt dan? Heb je in ieder geval opgezocht/gelezen/ begrepen van Creepy wat het ding doet?

Naja, hier een voorzetje:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Sub Timer_Event()

  Const OutputCount As Integer = 20
  Static OutputIndex as Integer = 0 ' 0...19
  
   ' New output state
  Dim NewState as Boolean = Not pControl.getPin(OutputIndex) 
  
  Call pControl.setPin(OutputIndex, NewState)
  
   ' If new output state is off, then we need to toggle the next output the next time we get the timer event

  If Not NewState Then 
    OutputIndex = (OutputIndex + 1) Mod OutputCount
  End If
  
End Sub


Ik zie dat je alleen de hoog status 2s wil hebben. Die aanpassing mag je zelf maken. :)

[ Voor 8% gewijzigd door farlane op 13-12-2004 10:46 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
bedankt hoor, maar ik heb het een beetje anders gedaan, (nu is hij nog altijd 2sec aan 2 sec uit etc, maar ik ben tevreden :) ).

public :
code:
1
2
Public mintTeller As Integer
Public mblnPoortAan As Boolean

knop :

code:
1
2
3
4
5
Timer2.Interval = 2000
        pControl.port = 888
        mblnPoortAan = True
        mintTeller = 0
        Timer2.Start()

en dan uiteindelijk de timer:

code:
1
2
3
4
5
6
7
8
If mintTeller = 8 Then
            mintTeller = 0
        End If
        pControl.setPin(mintTeller, mblnPoortAan)
        If mblnPoortAan = False Then
            mintTeller = mintTeller + 1
        End If
        mblnPoortAan = Not mblnPoortAan


dat was het, maar farlane, thanx voor de inspanning en het helpen om me op weg te zetten _/-\o_

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Visual Basic:
1
Private Const MAX_OUTPUT as Integer = 8


Visual Basic:
1
2
3
4
5
Private Sub Button_Click()
    mintTeller = MAX_OUTPUT - 1
    Timer2.Interval = 2000
    Call Timer2.Start()
End Sub


Visual Basic:
1
2
3
4
5
Private Sub Timer_Event()
    Call pControl.setPin( mintTeller, False )
    mintTeller = ( mintTeller + 1 ) Mod MAX_OUTPUT
    Call pControl.setPin( mintTeller, True )
End Sub
thanx voor de inspanning en het helpen om me op weg te zetten
Das NP, maar volgende keer ff iets meer laten zien. :)

[ Voor 15% gewijzigd door farlane op 13-12-2004 23:19 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1