[vb.net]Loop onderbreken met willekeurige toets

Pagina: 1
Acties:

  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09-2025
Na geruime tijd de complete MSDN-site en veelvuldig de search hier op GoT gebruikt te hebben open ik toch maar een nieuw topic.

probleem
Ik probeer het voor elkaar te krijgen dat een loop die tot een bepaalde maximum waarde loopt eerder af te breken door het intoetsen van een willekeurige toets. Dus op het moment dat er een willekeurige toets wordt ingedrukt moet er een exit do statement komen of een check die false wordt gemaakt zodat de loop stopt daarna verschijnt er dan een msgbox met de waarde tot dan toe.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Button1_Click(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles StartBt.Click

        Dim blnCheck As Boolean = True
        Dim intCounter As Integer = 0
        Dim strText as String
        Do   
            Do While intCounter < 120   
                intCounter += 1   
                If iskeypressed() = True Then 
                    blnCheck = False  
                    Exit Do  
                End If
                strText = Counter
                resultlbl.Text = strText
                resultlbl.Refresh()
                Sleep(10)
            Loop
        Loop Until blnCheck = False 
        MsgBox(strText)
    End Sub


het probleem zit in de functie iskeypressed.
Deze krijg ik niet voor elkaar. Ik weet dat het is is met onkeydown / WM_keydown, maar ik kom er niet uit hoe dit zou moeten gaan werken.
Ik zou zeer verheugd zijn als iemand mij een duwtje verder in de juiste richting kan geven.

Your time as a student is the best time of your life


  • whoami
  • Registratie: December 2000
  • Laatst online: 23-05 16:52
Maak een variable cancel (boolean), zet die op false.
In de key-down event oid zet je die variable op true.

Je code ziet er dan zo uit:
code:
1
2
3
4
5
6
7
8
9
10
while( intCounter < 120 )
{

   ....
   if( cancel )
   {
        break;
   }

}

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Of

code:
1
2
3
4
while( intCounter < 120 && !cancel)
{
   ....
}

[ Voor 10% gewijzigd door pjvandesande op 03-09-2004 11:39 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23-05 16:52
questa schreef op 03 september 2004 @ 11:39:
Of

code:
1
2
3
4
while( intCounter < 120 && !cancel)
{
   ....
}
Hum, ja. inderdaad. :+

https://fgheysels.github.io/


  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09-2025
OK, dat snap ik nog maar het wil toch nog niet helemaal werken.

code:
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
35
36
Public Class Form1
    Inherits System.Windows.Forms.Form
    Public Declare Sub Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long)
    Dim blnCheck As Boolean = True



    Private Sub Form1_KeyDown(ByVal sender As Object, _
 ByVal e As System.Windows.Forms.KeyEventArgs)_
 Handles MyBase.KeyDown
        
          blnCheck = False
    
   End Sub

    Private Sub Button1_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles StartBt.Click

        Dim intCounter As Integer = 0
        Dim strText As String = 0

        Do While intCounter < 120 And blnCheck = True

            intCounter += 1

            strText = intCounter
            resultlbl.Text = strText
            resultlbl.Refresh()
            Sleep(10)

        Loop

        MsgBox(strText)

    End Sub


Om een een of andere reden werkt de keydown event niet goed. Heb nu deze code en ik kan toetsen drukken wat ik wil stoppen doet ie niet...

[ Voor 4% gewijzigd door PeetR op 03-09-2004 11:53 . Reden: opmaak verneukende code gefixed ]

Your time as a student is the best time of your life


  • whoami
  • Registratie: December 2000
  • Laatst online: 23-05 16:52
Zet eens een breakpoint op die blnCheck = False in je KeyDown event.
Run je programma, druk op een toets en kijk of ie in die functie komt.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19:24

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 03 september 2004 @ 11:58:
Zet eens een breakpoint op die blnCheck = False in je KeyDown event.
Run je programma, druk op een toets en kijk of ie in die functie komt.
* gorgi_19 gokt het niet, aangezien de procedure oneindig lang doorgaat en daardus dus ook niet gereageerd wordt op de andere toets :) Ik denk dat daar pas op gereageerd kan worden als de eerdere procedure voltooid is.

[ Voor 10% gewijzigd door gorgi_19 op 03-09-2004 12:02 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09-2025
Dat is het vreemde. hij komt gewoon niet in de Keydown terecht. Het lijkt wel ofdat ie gewoon niet kijkt naar heel die event.
Maar hoe zorg ik ervoor dat ie daar wel naar kijkt?

@gorgi

Dat vermoeden heb ik dus ook. Maar er moet toch een manier zijn om dat te onderbreken?

[ Voor 25% gewijzigd door PeetR op 03-09-2004 12:05 ]

Your time as a student is the best time of your life


  • whoami
  • Registratie: December 2000
  • Laatst online: 23-05 16:52
Threading \o/

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void LoopMethod()
{
    while ( blaat )
    {
        ...
    }
}

private void Button1_Click( object sender, ... )
{
    Thread t = new Thread(new ThreadStart(this.LoopMethod);
    t.Start();
}

private void OnKeyDown_Spul( object sender, ... )
{
     _cancel = true;
}


Niet meteen best practices hoor, maar zo zou het moeten werken.
Je zou natuurlijk ook eens kunnen kijken naar Application.DoEvents() ofzo. Dan hoef je niet met threading in de weer te gaan. Gewoon in je Loop Application.DoEvents() aanroepen, en je keydown handler zal wel uitgevoerd worden.
Echter, dat zijn denk ik ook geen 'best practices'. DoEvents in een loop aanroepen is niet altijd goed voor de performance.

[ Voor 97% gewijzigd door whoami op 03-09-2004 12:08 ]

https://fgheysels.github.io/


  • Twee Dee
  • Registratie: Juli 2002
  • Laatst online: 00:24

Twee Dee

Morgen weer een ondertitel.

In je loop DoEvents aanroepen?
(Of werkt het niet zo in Vb.net? 8)7 )

[ Voor 41% gewijzigd door Twee Dee op 03-09-2004 12:07 ]

Luister nou gewoon naar me, dat voorkomt dat ik later "zie je wel" moet zeggen.


Verwijderd

Threads gebruiken

  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09-2025
@whoami & arneDM
Verklaar u nader...

Heb er wel is iets van gehoord, maar volgens mij was het of heel lastig of niet te doen met VB.net

[ Voor 9% gewijzigd door PeetR op 03-09-2004 12:08 ]

Your time as a student is the best time of your life


  • whoami
  • Registratie: December 2000
  • Laatst online: 23-05 16:52
PeetR schreef op 03 september 2004 @ 12:07:
Verklaar u nader...

Heb er wel is iets van gehoord, maar volgens mij was het of heel lastig of niet te doen met VB.net
threading in VB.NET is goed te doen afaik. In VB6 was het een probleem.
Zie m'n code voorbeeldje (in C#, maar makkelijk om te zetten naar vb.net)

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Zet in je while lus gewoon even onderaan:

code:
1
Application.DoEvents();


Dit procesed je messages.

  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09-2025
hmm de oplossing van questa schijnt goed te werken en is erg simpel
het enige wat nog fout was in de code is de handles van de form1_keydown sub
deze moest van mybase.keydown naar StartBt.KeyDown
dat heeft waarschijnlijk te maken met de focus??? :?

Your time as a student is the best time of your life


  • whoami
  • Registratie: December 2000
  • Laatst online: 23-05 16:52
whoami schreef op 03 september 2004 @ 12:05:
Threading \o/

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void LoopMethod()
{
    while ( blaat )
    {
        ...
    }
}

private void Button1_Click( object sender, ... )
{
    Thread t = new Thread(new ThreadStart(this.LoopMethod);
    t.Start();
}

private void OnKeyDown_Spul( object sender, ... )
{
     _cancel = true;
}


Niet meteen best practices hoor, maar zo zou het moeten werken.
Je zou natuurlijk ook eens kunnen kijken naar Application.DoEvents() ofzo. Dan hoef je niet met threading in de weer te gaan. Gewoon in je Loop Application.DoEvents() aanroepen, en je keydown handler zal wel uitgevoerd worden.
Echter, dat zijn denk ik ook geen 'best practices'. DoEvents in een loop aanroepen is niet altijd goed voor de performance.

https://fgheysels.github.io/


  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09-2025
ik had je post gelezen whoami...

ga zometeen (na het eten) jouw oplossing ook proberen, maar die van questa was gewoon ff makkelijk en snel te test... en het werkt nog ook. en inderdaad in jou post staat dezelfde oplossing ook, daar had ik in eerste instatie overheengelezen... Maar bedankt voor je oplossingen _/-\o_

kort een ander vraagje...

welke handle moet je nou gebruiken...
gebruik nu StartBt.KeyDown maar dat werkt natuurlijk alleen als de focus op de startbutton blijft. is er geen handle die alles handeld? of kan ik de handle gewoon weglaten?

Your time as a student is the best time of your life


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik weet niet precies hoe het in VB.NET werkt ( Volgens mij heb je iets van een AddHandler method ), maar in C# zou je het zo doen
C#:
1
2
3
4
5
6
7
8
this.KeyDown += new EventHandler( MyKeyHandlerMethod );
this.KeyPress += new EventHandler( MyKeyHandlerMethod );
myButton.Click += new EventHandler( MyKeyHandlerMethod );

private void MyKeyHandlerMethod( object Sender, EventArgs e )
{
....
}

[ Voor 23% gewijzigd door Woy op 03-09-2004 12:44 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19:24

gorgi_19

Kruimeltjes zijn weer op :9

Addhandler kan je idd in VB.Net gebruiken. Maar Handles doet in principe hetzelfde. Addhandler gebruik je om 'dynamisch' events te koppelen aan een method.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
gorgi_19 schreef op 03 september 2004 @ 12:44:
Addhandler kan je idd in VB.Net gebruiken. Maar Handles doet in principe hetzelfde. Addhandler gebruik je om 'dynamisch' events te koppelen aan een method.
Ah, kan je daarmee ook meerdere events handlen door ze met komma te scheiden?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09-2025
@rwb

ja dat kan.... zie code

@Whoami
jou oplossing met threading werkt ook goed... codeopbouw is inderdaad wel iets anders maar daar was nog wel uit tekomen (hulde aan de MSDN-site)

code:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Imports System.Threading
Public Class LoopApplication2
    Inherits System.Windows.Forms.Form

    Public Declare Sub Sleep Lib "kernel32"_
 (ByVal dwMilliseconds As Long)
    Dim blnCheck As Boolean = True

    Private Sub LoopApplication2_KeyDown(ByVal sender As Object,_
 ByVal e As System.Windows.Forms.KeyEventArgs)_
 Handles StartBt.KeyDown, btnStop.KeyDown, MyBase.KeyDown,_
 resultlbl.KeyDown, closeBtn.KeyDown

        blnCheck = False

    End Sub

    Private Sub loopding()
        blnCheck = True
        Dim intCounter As Integer = 0
        Dim strText As String = 0

        Do While intCounter < 500 And blnCheck = True

            intCounter += 1

            strText = intCounter
            resultlbl.Text = strText
            resultlbl.Refresh()
            Sleep(100)

        Loop
        MsgBox(strText)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles StartBt.Click

        Dim t As Thread = New Thread(AddressOf loopding)
        t.Start()

    End Sub

    Private Sub btnStop_Click(ByVal sender As System.Object,_
 ByVal e As System.EventArgs) Handles btnStop.Click

        blnCheck = False

    End Sub

    Private Sub delay(ByVal x As Integer)

        Sleep(x * 1000)

    End Sub


    Private Sub closeBtn_Click(ByVal sender As System.Object,_
 ByVal e As System.EventArgs) Handles closeBtn.Click

        blnCheck = False
        Me.Close()

    End Sub

End Class


en dit werkt perfect.... Dank voor uw medewerking _/-\o_

[ Voor 99% gewijzigd door PeetR op 03-09-2004 14:24 ]

Your time as a student is the best time of your life

Pagina: 1