Hallo Ralf, hallo ihr anderen.
Dank Dir für Deine Ausführungen. Habe ein paar Tests gemacht, das nacheinander Aufrufen klappt bei einfachen Funktionen wie
Private Sub RoutineA()
Dim i = 1
For i = 1 To 10
Debug.Print("Routine A: Ich zähl mal: " & i)
Next
End Sub ganz gut. In meiner Anwendung hingegen, schicke ich einen Messbefehl über einen Seriellen port zu einem Messgerät. Dieses braucht ein paar Sekunden, bis es seine Antwort über den seriellen port zurückschickt. Dies löst dann den ComPort.DataReceived event aus, der dann die Daten den Messgeräts verarbeitet.
Private Sub messen()
comport.writeline(M) 'Messbefehl
End Sub Empfangen der Messdaten
Private Sub Receiver1(ByVal sender As Object, ByVal e As _
SerialDataReceivedEventArgs) Handles ComPort6.DataReceived
RXString1 = ComPort6.ReadLine()
BeginInvoke(New StringSubPointer(AddressOf Display), RXString1)
End Sub Auswerten der Messdaten:
Private Sub Display(ByVal Buffer As String)
arrayt1 = Buffer.Split(",")
t1h = CDbl(arrayt1(2))
t1h = (t1h * 3.4262591)
t1x = arrayt1(3)
t1y = CDbl(arrayt1(4))
arrayt1t(2) = t1h
arrayt1t(3) = t1x
arrayt1t(4) = t1y
tb_1h.Text = CInt(arrayt1t(2))
tb_1x.Text = arrayt1t(3)
tb_1y.Text = arrayt1t(4)
End Sub Was ich erstmal erreichen möchte, ist eine 2 malige Messung und Auswertung hintereinander. Wenn ich es so machte, wie Du es vorgeschlagen hast, würde das so aussehen:
messen()
messen() Es passiert leider Folgendes:
Ein Messbefehl wird gesendet, "messen()" ist beendet, das Programm springt zurück und ruft DIREKT wieder "messen()" auf. Natürlich geht das so schnell, dass das Messgerät den ersten Befehl noch gar nicht richtg verarbeitet hat, und noch gar keine Messung durchgeführt wurde. Das Messgerät erhält zwei Messbefehle direkt nacheinander und weiß nicht, was es machen soll.
Was ich also brauche, wäre eine Möglichkeit, dass der zweite Befehl ("messen()" erst dann abgearbeitet wird, wenn der erste Befehl abgearbeitet wurde UND das Messergebnis verarbeitet wurde.
Wie kann man so was realisieren?
Ich habe es mal hiermit probiert:
Private Sub idle()
If messen1 = False Then
messen()
End If
If messen1 = True Then
messen()
End If
End Sub dann wird in der routine "Display" am Ende das Flag messen1 = true gesetzt und messen() aufgerufen. Das funktioniert auch. Nur: Ruft dann nicht wieder eine Funktion die andere auf? Ich drehe mich also wieder im Kreise, oder? Wenn ich das auf mein (großes) Programm ummünze, läuft also alles wieder auf einen Overflow heraus-> idle() ruft messen() auf. Display ruft idle() auf. idle() ruft messen() auf und so weiter...
Wie könnte man die Zeit, die das Messgerät braucht ausgleichen?
Ich habe schon über eine schleife nachgedacht, die in idle() abläuft. Diese läuft dann so lange, bis dioe Auswertung fertig ist. Aber ich habe es nicht geschafft, diese zu realisieren.
Ich hoffe, Du und ihr versteht die Problematik, vor der ich gerade stehe und könnt mir weiterhelfen...
Besten Dank!!
DJ Booking + Veranstaltungstechnik: www.roadresidents.de |