BooleanFlag mit Timer, übergabe einer Variable

  • VB.NET
  • .NET (FX) 4.0

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    BooleanFlag mit Timer, übergabe einer Variable

    Hallo miteinander zur späten Stunde,
    ich habe folgendes Problem:
    Ich habe eine Messkarte bei der ich Spannung auslese. Dies passiert auch, jedoch will ich die Berechnung außerhalb meines HandleBufferDone erledigen. Da bei einem durchlauf 32786 Werte ausgegeben werden
    Nach ca. 1Sekunde startet dieses wieder von vorne.
    Wie kann ich die Werte volts1 übergeben. Ich habe den Tip bekommen es mit einem Timer und einer Boolean Flag zu machen, jedoch habe ich keinen Plan wo welcher Teil hinkommt.

    Mein Code sieht bisher so aus:

    VB.NET-Quellcode

    1. Try
    2. Dim aiSS As AnalogInputSubsystem = CType(sender, AnalogInputSubsystem)
    3. If dtBuffer.ValidSamples > 0 Then
    4. BuffersCompleted += 1
    5. 'Wenn die Kanäle im Frame in der Checkbóx aktiv ist, wird dieser hier verwendet
    6. If chkKanal1.Checked Then volts1 = dtBuffer.GetDataAsVolts(aiSS.ChannelList(0))
    7. If chkKanal2.Checked Then volts2 = dtBuffer.GetDataAsVolts(mAinSS.ChannelList(1))
    8. If chkKanal3.Checked Then volts3 = dtBuffer.GetDataAsVolts(mAinSS.ChannelList(2))
    9. If chkKanal4.Checked Then volts4 = dtBuffer.GetDataAsVolts(mAinSS.ChannelList(3))
    10. If chkKanal5.Checked Then volts5 = dtBuffer.GetDataAsVolts(sAinSS.ChannelList(0))
    11. aiSS.BufferQueue.QueueBuffer(dtBuffer)
    12. Dim samplesToDisplay As Integer = If(dtBuffer.ValidSamples >= Integer.Parse(txtSamplesPerBuffer.Text), Integer.Parse(txtSamplesPerBuffer.Text), dtBuffer.ValidSamples)
    13. If aiSS.SynchronizationMode = SynchronizationModes.Master Then
    14. masterBuffersCompleted += 1
    15. lblNumPlottedMaster.Text = masterBuffersCompleted.ToString()
    16. For i As Integer = 0 To volts1.Length - 1
    17. Next
    18. Else
    19. slaveBuffersCompleted += 1
    20. lblNumPlottedSlave.Text = slaveBuffersCompleted.ToString()
    21. For i As Integer = 0 To volts5.Length - 1
    22. ' txtChannel5.Text = volts5(i)
    23. Next
    24. End If
    25. End If
    26. Catch e As Exception
    27. StatusBar1.Text = e.Message
    28. End Try
    29. [\vbnet]
    30. Es geht momentan hauptsächlich um Volts1, volts1 soll dann im nächsten Sub aufgegriffen werden und weiter berechnet werden.
    31. nehme ich dann im nächsten Sub:
    32. [vbnet]
    33. For i = 0 To volts1.Length - 1
    34. volts1(i) = txtChannel1.Text
    35. Next

    wird natürlich nichts angezeigt...
    votls1 ist selbstverständlich eine globale Variable


    Wer kann mir helfen???
    Was ist bei Dir "HandleBufferDone"? Ist das der Name der Prozedur, die Du hier postest? Wenn ja, fehlt der Prozedurkopf, denn Zeile#36 mit e.Message ist wohl ein spezieller EventArgs-Parameter. Da wär der Prozedurkopf schon recht sinnvoll. Der gepostete Prozedurinhalt geht etwas zu weit über das Problem hinaus, aber sei's drum.
    In Z#38 ist der Tag falsch codiert. Da gehört ein / hin und kein \. Daher ist ein Teil Deines Beschreibungstextes Teil des Codes.
    "votls1 ist selbstverständlich eine globale Variable"; Ich weiß zwar nicht, was Du unter globaler Variable bei Visual Basic .Net verstehst, aber für den unwahrscheinlichen Fall, dass es tatsächlich eine echte globale Variable ist (und nicht nur eine Membervariable der umgebenden Klasse), dann sag ich nur: Fehldesign.

    Was soll bitte in Z#44-#46 geschehen? Du überschreibst alle Variablen des Volts1-Feldes mit dem Text aus txtChannel1. Ist das gewollt? Warum willst Du die Daten außerhalb verfügbar machen, wenn Du sie eh dann überschreibst? Klar, dass da nix angezeigt wird. Von TextBox in Variable ergibt nunmal keine Anzeige. Und solltest Du es andersrum schreiben, also

    VB.NET-Quellcode

    1. For i = 0 To volts1.Length - 1
    2. txtChannel1.Text = volts1(i)
    3. Next
    dann ergibt das natürlich auch keine sinnvolle Anzeige, da der Text in der TextBox immer wieder mit einem Variablenwert überschrieben wird. Am Ende stünde da nur der allerletzte volts1-Wert drin.
    Welchen Datentyp hat das volts1-Feld eigentlich? Ich hoffe String(), denn sonst programmierst Du (s. Z#45) Option Strict Off, was bei vielen Forenmitgliedern weitere Antworten einschränkt, bis das und die Folgefehler behoben sind.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,
    Volts1 ist Double()

    Der Code ist nur ein Auszug aus dem Programm...
    Das läuft soweit alles fehlerfrei

    Txtchannel, war nur eine Überprüfung ob es läuft, wie schon geschrieben, wird in z45 anschließend mit volts1(i) weiter gerechnet. die werte sind in den einzelnen indexe vorhanden, bei einem haltepunkt.

    Hier soll dann einmal ein effektivwert berechnet werden, aber dazu später...

    Wie bekomme ich werte korrekt übergeben?
    Wenn alles fehlerfrei funktioniert und volts() eine globale Variable ist: Wo ist dann das Problem? Wo macht denn das Programm nicht, was Du willst?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dome2107 schrieb:

    Im prinzip möchte ich
    Kannst Du Deine Beschreibung mal deutlich präzisieren?
    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!
    Das thema ist recht umfangreich...
    Es handelt sich um 2 messkarten, die als master und Slave parametriert werden, in der oben genannten Prozedur werden die Daten ausgelesen. Das volt array umfasst pro buffer 32786 Werte(mindestens) es soll im prinzip wenn ein Buffer durchgelaufen ist, der Slave durchgang erfolgen, dann soll die booleanflag auf true gestellt werden, damit die Werte in einer anderen Sub bearbeitet werden können(fft, effektivwert, etc)
    Es sollen die Werte wenn ein Durchgang gelaufen weitergegeben werden nach 100ms etwa soll die booleanflag auf false gesetzt werden und der nächste buffer starten

    @RodFromGermany, ich hoffe du kannst damit was anfangen

    Dome2107 schrieb:

    ich hoffe du kannst damit was anfangen
    Mal sehen.
    Du willst also zwei disjunkte Takte synchronisieren?
    Ein Takt generiert die Messwerte, der andere das Schaltflag?
    Da sollte doch ein Takt genüben.
    Immer, wenn Du die Daten ausgelesen hast, schaltest Du das Flag um, das wäre dann synchron.
    Oder hab ich da was falsch verstanden?
    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!

    Dome2107 schrieb:

    wie setze ich das um?
    Was bitte?
    Momentan reden wir über inhaltliche Skizzen, das sind noch keine belastbaren Pläne.
    Du solltest erst dann anfangen zu programmien, wenn der Inhalt der aktuellen Version vollständig beschrieben und Dir völlig klar ist, und das ist beides noch nicht geschehen.
    Also fang an mit einem belastbaren Plan.
    Belastbar heißt elementar, wenn Du zu einem Teilproblem eine passende Antwort bekommst, kannst Du nicht sagen: das hab ich so nicht gemeint.
    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!

    Dome2107 schrieb:

    Lösungsansatz
    Schreib präzise in allen Einzelheiten auf, was unter welchen Bedingungen passieren soll (=> Lastenheft => Pflichtenheft).
    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!