[VB.NET] Loop beëindigen*

Pagina: 1
Acties:

  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 03-04 11:09
Ik ben bezig met een programmatje voor mijn stappenmotor. Ik maak dit in Microsoft Visual Basic 2005 Express Edition Beta (is dat VB6?). Ik kan nu de printerpoort aansturen met inpout.dll en dan zie ik ook reactie bij de motor. als ik echter met 4 knopjes de spoelen 1 voor 1 spanning geef gaat het goed, maar zodra ik een loop instel dat de motor door blijft draaien gaat het fout. ik kom op geen mogelijkheid meer uit die loop en het programmatje loopt vast :|

ik heb al verschillende dingen geprobeerd. ik heb 1 knop voor draaien (cmdTurnL), een stopknop (cmdStop) en een aanpasbaar getal (nmrDelay). verder een variabele die 1 is als de motor moet draaien en 0 als hij moet stoppen. hier de code van een aantal:

dit is voor de stopknop en is overal hetzelfde:
Visual Basic:
1
2
3
4
    Private Sub cmdStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStop.Click
        intTurn = 0
        Out(Val(888), Val(0))
    End Sub


Do Loop:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    Private Sub cmdTurnL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTurnL.Click
        intTurn = 1

        Do
            Out(Val(888), Val(1))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(3))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(2))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(6))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(4))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(12))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(8))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(9))
            Sleep(nmrDelay.Value)

            If intTurn = 0 Then
                Exit Do
            End If
        Loop

    End Sub

Do Until:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Private Sub cmdTurnL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTurnL.Click
        intTurn = 1

        Do Until intTurn = 0

            Out(Val(888), Val(1))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(3))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(2))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(6))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(4))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(12))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(8))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(9))
            Sleep(nmrDelay.Value)

        Loop

    End Sub

Do While
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Sub cmdTurnL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTurnL.Click
        intTurn = 1

        Do While intTurn = 1

            Out(Val(888), Val(1))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(3))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(2))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(6))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(4))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(12))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(8))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(9))
            Sleep(nmrDelay.Value)

        Loop
    End Sub

While:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Sub cmdTurnL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTurnL.Click
        intTurn = 1

        While intTurn = 1

            Out(Val(888), Val(1))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(3))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(2))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(6))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(4))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(12))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(8))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(9))
            Sleep(nmrDelay.Value)

        End While
    End Sub


Dit zijn de laatste 4 die ik geprobeerd heb. de Out(Val(888), Val(xx)) is het signaal dat naar de printerpoort gaat.

Als ik nu dus op de knop cmdTurnL klik gaat de motor wel draaien met de snelheid die nmrDelay aangeeft. maar als ik op de stopknop druk, loopt het programma vast. in mijn ogen zou de printerpoort dan weer op 0 gezet moeten worden en intTurn dan 0 moeten worden en de loop stoppen omdat die niet meer aan de voorwaarden voldoet. wie kan mij helpen ?

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?


Verwijderd

Hoi,

VB 2005 is al zeker geen VB6. Maar zo opt eerste zicht lijkt het er wel veel op.
In VB zou je een DoEvents in je lussen moeten zetten, één DoEvents per lus.
Dan wordt de code in de andere sub ook daadwerkelijk uitgevoerd.

Dus antwoord is "DoEvents" of synoniem daarvoor in VB2005

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:35
Waar jij in werkt , is VB.NET.

Uw code zorgt ervoor dat je applicatie volledig bezig is met het uitvoeren van die loop. Je applicatie is niet meer responsief omdat ze gewoon weg geen tijd meer heeft om op events te reageren.
Een Application.DoEvents() kan een oplossing zijn, dit zal er nl. voor zorgen dat de applicatie tijd maakt om op die events te reageren.

Jouw Loop constructie is trouwens ranzig.
Kijk eens in de MSDN naar de syntax van de Loop statement, en zie hoe je dat netjes moet doen:
code:
1
2
3
Do
   ..
Loop Until intNum = 0

Ipv met die Exit Loop te werken.

[ Voor 24% gewijzigd door whoami op 07-07-2005 08:59 ]

https://fgheysels.github.io/


  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 03-04 11:09
owkee, die eerste was niet netjes, maar ik wist ff nix anders meer om te proberen. De loop code die jij geeft werkt dus ook niet, maar dat is logisch als die andere ook niet werken. ik heb even gezocht naar DoEvents, maar daar kan ik niet echt iets over vinden (misschien omdat dit nog een beta versie is?) ik kan wel wat vinden, maar dat werkt dan niet. moet ik dan eerst een module aanmaken met dit:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            Out(Val(888), Val(1))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(3))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(2))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(6))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(4))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(12))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(8))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(9))
            Sleep(nmrDelay.Value)

en die dan aanroepen als ik op de knop druk ?

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:35
Dat je doevents niet vind, heeft helemaal niets te maken met het feit dat het een beta versie is.

Als ik op DoEvents zoek, in m'n MSDN, dan vind ik het wel. Het is een static member van de Application class.

https://fgheysels.github.io/


  • DP Kunst
  • Registratie: Juni 2003
  • Laatst online: 03-04 11:09
tnx, dat werkt. alleen nog 1 probleem, ik moet 3 keer klikken.
  • de eerste keer klik ik op stop en zie ik de draaiknop ingedrukt worden
  • de tweede keer stopt het draaien maar blijft de laatste spoel bekrachtigd
  • en de derde keer word ook de laatste spoel ontkrachtigd
ik heb nu dit bij de stopknop
Visual Basic:
1
2
3
4
    Private Sub cmdStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStop.Click
        Out(Val(888), Val(0))
        intTurn = 0
    End Sub

en dit bij de draai knop:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    Private Sub cmdTurnR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTurnR.Click
        intTurn = 1

        Do While intTurn = 1

            Application.DoEvents()

            Out(Val(888), Val(9))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(8))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(12))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(4))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(6))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(2))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(3))
            Sleep(nmrDelay.Value)

            Out(Val(888), Val(1))
            Sleep(nmrDelay.Value)
        Loop
    End Sub


hoe maak ik het dan dat de stop knop de eerste keer goed ingedrukt word, de motor stopt en dat er een 0 naar de printerpoort gestuurd word :? volgens mij zou die dat nu toch echt moeten doen

Mijn nieuwe portfolio (Under Construction) | Benieuwd wat Solar Team Twente gaat doen?


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:35
Ik denk dat je je code eens zult moeten debuggen. VB.NET biedt je genoeg mogelijkheden om je code eens stap voor stap uit te voeren.
Dan kan je zien wat er exact gebeurt.

https://fgheysels.github.io/


  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 31-03 22:53
whoami schreef op donderdag 07 juli 2005 @ 14:06:
Ik denk dat je je code eens zult moeten debuggen. VB.NET biedt je genoeg mogelijkheden om je code eens stap voor stap uit te voeren.
Dan kan je zien wat er exact gebeurt.
tjah, waarvoor zou die dat doen ? dit is toch veel makkelijker! (sarcastisch)
Pagina: 1