Schleifen und Variable

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Schleifen und Variable

    Hallo
    Ich habe seit neustem ein Interface (K8055 von Velleman).
    Dieses soll eine Lichtorgel steuern.

    Ansteuern und so funktioniert auch einwandfrei.
    Jetzt möchte ich aber folgendes machen.
    Ich will in ein Textfeld die bpm zahl des Liedes eingeben können z.B. 128bpm
    Dieser Wert soll dann genommen werden um den taktgleichen Wechsel der Leds zu ermöglichen (60sek durch 128 = ein wechsel alle 0,46 sek)


    Wenn man diesen Wert eingegeben hat soll es einen Start und Stopp Knopf geben.
    Mit dem einen Startet man das Programm nach Eingabe des Wertes und mit dem anderen stoppt man es (Wer hätte das gedacht).
    Das Programm soll nach drücken des Startknopfes in Dauerschleife laufen -> bis stop.

    Bisher habe ich als Zeitintervall "System.Threading.Thread.Sleep(460)"
    was aber ja das komplette Programm einfriert und somit hier nicht zu gebrauchen ist.

    Ich hoffe ihr könnt mir helfen!

    Danke im Vorraus
    Lukas
    System.Threading.Thread.Sleep(460) hält den Thread an. Daher ist es nur zu gebrauchen, wenn du den Befehl innerhalb eines anderen Threads verwendest, ansonsten friert wie du schon erkannt hast das Programm ein.
    Genau für soetwas ist ein Timer gedacht. Füge einen zu deinem Programm hinzu, und stelle den Intervall gemäß der Textbox ein.

    VB.NET-Quellcode

    1. timer1.interval=cint(textbox1.text)
    Beim Startbutton startesat du halt den Timer, beim Stoppbutton beendest du ihn

    VB.NET-Quellcode

    1. Sub btnstart_Click '...
    2. timer1.start
    3. end sub
    4. sub btnStopp_click '...
    5. timer1.stop
    6. end sub
    Zerlege Deinen Post in mehrere sinnvolle Einzelprobleme und löse die separat.
    Sleep(n) ist nur dann sinnvoll, wenn Du es in einem separaraten Thread verwendest.
    Im GUI-Thread hat es absolut nix zu suchen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo
    danke für die schnelle Antwort.
    Mein Programm sieht jetzt so aus:

    VB.NET-Quellcode

    1. Public Class Form1 Private Declare Function OpenDevice Lib "k8055d.dll" (ByVal CardAddress As Integer) As Integer Private Declare Sub CloseDevice Lib "k8055d.dll" () Private Declare Function ReadAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer) As Integer Private Declare Sub ReadAllAnalog Lib "k8055d.dll" (ByRef Data1 As Integer, ByRef Data2 As Integer) Private Declare Sub OutputAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer, ByVal Data As Integer) Private Declare Sub OutputAllAnalog Lib "k8055d.dll" (ByVal Data1 As Integer, ByVal Data2 As Integer) Private Declare Sub ClearAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer) Private Declare Sub SetAllAnalog Lib "k8055d.dll" () Private Declare Sub ClearAllAnalog Lib "k8055d.dll" () Private Declare Sub SetAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer) Private Declare Sub WriteAllDigital Lib "k8055d.dll" (ByVal Data As Integer) Private Declare Sub ClearDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer) Private Declare Sub ClearAllDigital Lib "k8055d.dll" () Private Declare Sub SetDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer) Private Declare Sub SetAllDigital Lib "k8055d.dll" () Private Declare Function ReadDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer) As Boolean Private Declare Function ReadAllDigital Lib "k8055d.dll" () As Integer Private Declare Function ReadCounter Lib "k8055d.dll" (ByVal CounterNr As Integer) As Integer Private Declare Sub ResetCounter Lib "k8055d.dll" (ByVal CounterNr As Integer) Private Declare Sub SetCounterDebounceTime Lib "k8055d.dll" (ByVal CounterNr As Integer, ByVal DebounceTime As Integer)
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load OpenDevice(0) End Sub
    3. Private Sub start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles start.Click Timer1.Interval = CInt(TextBox1.Text) Timer1.Start()
    4. End Sub
    5. Private Sub stopp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles stopp.Click Timer1.Stop() ClearAllDigital() End SubEnd Class



    Wo muss ich jetzt den befehl SetDigitalChannel(1) und dann 2 usw einsätzen?

    Lukas

    Edit
    Kann mir jemand sagen, wie ich den Quellcode richtig einfüge, den verseht ja so kein Mensch :O
    Hallo
    funktioniert perfekt.
    Aber wenn ich das jetzt so mache:

    VB.NET-Quellcode

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



    dann gehen beide LEDs nach der Zeit, die von mir eingegeben wurde an.
    Ich will ja, das eine nach der anderen angeht in dem Abstand, den ich vorher eingegeben habe.

    Lukas
    Oder du musst dir einfach merken welche du zu letzt eingeschaltet hast

    Quellcode

    1. Private eingeschaltet as integer = 2
    2. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    3. eingeschaltet = iif(eingeschaltet = 1, 2, 1)
    4. ClearAllDigital()
    5. SetDigitalChannel(eingeschaltet)
    6. End Sub
    Hallo
    also es ist so.
    Mit SetDigitalChannel(1-8) mach ich die LED an und mit ClearDigitalChannel(1-8) mache ich ihn aus.

    Das was ich jetzt eigentlich erstmal hinbekommen will ist, dass wenn ich eine Zeit eingebe (sagen wir 1000ms) die LEDs in einem Intervall von 1sek angehen.
    something like....

    VB.NET-Quellcode

    1. Private position As Integer
    2. Sub tmr_tick() handles deintimer.tick
    3. ClearAllDigital()
    4. SetDigitalChannel(position)
    5. If position < 8 Then
    6. position += 1 'nächste Lampe
    7. Else
    8. position = 1 'oder zurück zur ersten
    9. End If
    10. End Sub
    Hallo
    ich glaube so funktioniert das nicht.
    Als erstes wird dieser befehl ja deklariert:

    VB.NET-Quellcode

    1. Private Declare Sub SetDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer)



    Wenn ich unten dann z.B. schreibe

    VB.NET-Quellcode

    1. SetDigitalChannel(1)

    Leuchtet die erste LED bis ich wieder sage:

    VB.NET-Quellcode

    1. ClearDigitalChannel(1)



    Das heißt ich brauche eigentlich nur einen "Platzhalter" zwischen SetDigitalChannel(1) und SetDigitalChannel(2)
    Und dieser Platzhalter soll halt der zeit entsprechen, die ich vorher eingegeben habe.
    Lukas

    Fleckenzwerg schrieb:

    Das heißt ich brauche eigentlich nur einen "Platzhalter" zwischen SetDigitalChannel(1) und SetDigitalChannel(2)

    solche Zeit-Platzhalter gibt es aber nicht.

    Dassis prozedurale Denke, und die ist hier nicht anwendbar.

    Wenn alle 1000ms die nächste LED geschaltet werden soll, mußt du einen Timer nehmen, ungefähr wie von FloFuchs vorgemacht.
    Hallo
    Okay, das hat funktioniert.

    Jetzt gibt es aber noch ein Probelm, da ich ja Effekte machen will muss ich manchmal mehrere LEDs gleichzeitig anschalten, oder auch ausschalten.
    Um die die LEDs nach dem Anschalten nicht wieder auszuschalten muss ich ja nur folgendes rausnehmen:

    VB.NET-Quellcode

    1. ClearAllDigital()



    Aber was ist, wenn ich jetzt z.B. Channel 6 und 1 Anschalten will, dann geht das lauflicht nach jedem Tick von 1-5 hoch und fängt dann von vorne an, aber parallel Channel 7 statt 6?

    Wie ist es möglich sowas zu realisieren?

    LUkas