Forum: PC-Programmierung Software funktioniert nicht auf allen PCs


von Max (Gast)


Lesenswert?

Hallo,

ich habe Software entwickelt die einen Teststand über ein GUI steuert. 
Der zeitkritische Teiltest funktioniert auf manchen PC nicht immer. Auf 
beiden PC ist Win xp installiert. Es laufen mehrere Threads. Der PC mit 
einem schnelleren Prozessor macht Probleme. Kommuniziert wird mit einem 
Funkmodul, dem ein FTDI Chip vorgeschaltet ist.

Also ich frag einfach mal, da ich seit 1,5 Wochen nach einer Lösung 
suche. Hoffe einfach mal auf einen Tipp, der mich in die richtige 
Richtung leitet.

Vielen Dank schon mal.

von Max (Gast)


Lesenswert?

Also das Funkmodul macht "auch" Probleme und funktioniert bei 2 
aufeinanderfolgenden Testvorgängen meist nicht.

von Peter II (Gast)


Lesenswert?

Max schrieb:
> Es laufen mehrere Threads. Der PC mit
> einem schnelleren Prozessor macht Probleme.

klingt stark nach einen Threadproblem. Überprüfe alle zugriffe auf 
globale Variablen/Daten.

von Nilix (Gast)


Lesenswert?

>>...Teststand über ein GUI steuert

Darunter kann man sich nur wenig vorstellen, genauere Beschreibung wäre 
gut.
evtl. überfährst du den FTDI.

von Max (Gast)


Lesenswert?

Bei diesem Teststand wird über RS232 ein Mc angesteuert und über USB 
eine Platine zur Farbanalyse. Zudem wird mit dem Prüfling über Funk 
kommuniziert, wozu das Funkmodul genommen wird. Dazu steht ihm ein 
Thread bereit, der die Eingangsdaten des FTDI-Chip (über einen Treiber, 
der direkt auf die USB-Schnittstelle zugreift mit Hilfe einer 
Seriennummer (D2XX-Treiber)) in einen Eingangspuffer schreibt. Ansonsten 
stellen alle anderen Threads , der in Vb.net geschriebenen Software, 
eine Instanz der Klasse Backgroundworker dar, also dem Backgroundworker 
steht auch ein Thread zur Verfügung und dieser Klasse steht in vb.net 
einige Funktionalität bereit.
Der zeitkritische Vorgang, bei dem mit dem Prüfling kommuniziert wird 
(Anmeldung), findent in einem Backgroundworker statt.

Was bedeuted, dass ich den FTDI überfahre?

von Max (Gast)


Lesenswert?

noch ein Nachtrag. Unter win7 funktioniert diese Software wiederum mit 
einem mind. ebenso schnellen, wie der PC auf dem sie nicht unter win xp 
funktioniert.

Peter II schrieb:
> klingt stark nach einen Threadproblem. Überprüfe alle zugriffe auf
> globale Variablen/Daten.

Wieso darauf überprüfen? Weiß nicht was ich jetzt tun soll.

von Robert L. (lrlr)


Lesenswert?

du hast also 1,5 Wochen gesucht,
die suche ergab bisher : "es funktioniert nicht"..


ich glaub du suchst einfach falsch
lass z.B. mal jeden Thread mitloggen was er/wann macht...



(wenns zeitkritisch ist, nimmt man keine threads ;-)...

von Udo S. (urschmitt)


Lesenswert?

Kommunizierst du aus mehreren Threads mit dem Funkmodul bzw. mit einer 
seriellen Schnittstelle?
Falls ja fang neu an. Überlege dir welcher Thread für was zuständig ist. 
Dann mache saubere Schnittstellen zwischen den Threads. Synchronisiere 
die Schnittstellen.

von Patrick W. (paddy)


Lesenswert?

Robert L. schrieb:
> (wenns zeitkritisch ist, nimmt man keine threads ;-)...

... und vor allem auch keinen Windows XP oder 7 PC. Du kannst nie wissen 
was der zum Ausführungszeitpunkt alles macht.

von Peter II (Gast)


Lesenswert?

Max schrieb:
> Peter II schrieb:
>> klingt stark nach einen Threadproblem. Überprüfe alle zugriffe auf
>> globale Variablen/Daten.
>
> Wieso darauf überprüfen? Weiß nicht was ich jetzt tun soll.

man muss jeden Zugriff auf Variablen (oder Objekte) Threadsicher machen. 
Das heist das immer nur ein Thread darauf zugreifen kann.

Wenn du z.b. 2. Threads hast die eine Variabel hochzählen

i = i + 1;

dann ist du hier schon einen Fehler, weil der zugriff nicht atomar ist. 
Du verzählst dich damit.

von Max (Gast)


Lesenswert?

Robert L. schrieb:
> du hast also 1,5 Wochen gesucht,
> die suche ergab bisher : "es funktioniert nicht"..
>
>
> ich glaub du suchst einfach falsch
> lass z.B. mal jeden Thread mitloggen was er/wann macht...
>
>
>
> (wenns zeitkritisch ist, nimmt man keine threads ;-)...

was versteht man denn darunter? System.Diagnostics - aufzeichnen und 
auslesen? Oder Software nutzen wie SmartInspect?

Stehen nur Rechner mit win xp und 7 zur Verfügung.

von Peter II (Gast)


Lesenswert?

Max schrieb:
>> ich glaub du suchst einfach falsch
>> lass z.B. mal jeden Thread mitloggen was er/wann macht...
> was versteht man denn darunter? System.Diagnostics - aufzeichnen und
> auslesen? Oder Software nutzen wie SmartInspect?

siche ich nicht als sinnvoll an. Mit dem System.Diagnostics änderst du 
das Zeitverhalten der Threads und der fehler kann schon nicht mehr 
auftreten.

Zeige doch einfach mal etwas quellcode, wichtig ist der Thread und der 
Teil der die Daten dann weiterverarbeitet.

von Markus M. (mark_m)


Lesenswert?

Beschreib doch mal die Aufgaben der "Backgoundworker". Gibt es da 
Überschneidungen bei der Nutzung von den Daten oder Resourcen?

Du beschreibst auch nicht die Art der Fehlfunktion. Beendet sich das 
Programm unplanmäßig? Stimmten die Versionen der Frameworks die VB nutzt 
überein?

Wie sieht es mit deiner Fehlerbehandlung aus. Ignorierst Du Fehlercodes 
und Exceptions, sodass Du Probleme gar nicht mit bekommst?

Du musst schon detaillierter dein Problem schildern.

Grüsse

von dadada (Gast)


Lesenswert?

hast Du überhaupt Zugriff auf den Sourcecode?

von Max (Gast)


Lesenswert?

Quellcode kommt gleich, erkläre dann anhand von ihm

von MaWin (Gast)


Lesenswert?

> Also ich frag einfach mal

Unter Windoss 3.1 konnte man noch sehr gut echtzeitfähige 
Anwenderprogramme schreiben, denn die Interrupts standen den 
Anwenderprogrammen zur Verfügung und es gab nichts höherpriorisiertes.

Seit dem Festplattencache vcache.386 hatte man Probleme, weil das per 
NMI jeden Prozess bis zur Ewigkeit ausbremsen konnte, damit war Win95 
nicht mehr für Echtzeitanwendungen geeignet, es sei denn, man schmiss 
das Cache raus.

Wenn man überhaupt auf Interrupts reagieren muss, muss man heute Device 
Treiber schreiben, die im höherpriorisierten Kernel sitzen. Das geht 
unter Windows XP noch.

Mit Windows 7 ist auch das unmöglich geworden, du müsstest deine Treiber 
signieren, das Betriebssystem ist somit vollkommen unbrauchbar für 
Echtzeitexperimente.

Unter Linux sieht es übrigens nicht besser aus.

Manche Leute nennen das Fortschritt.

von Peter II (Gast)


Lesenswert?

MaWin schrieb:
> Wenn man überhaupt auf Interrupts reagieren muss, muss man heute Device
> Treiber schreiben, die im höherpriorisierten Kernel sitzen. Das geht
> unter Windows XP noch.

das ganze ist zwar schön zu wissen, spielt hier aber überhaupt keine 
rolle.

> Mit Windows 7 ist auch das unmöglich geworden, du müsstest deine Treiber
> signieren, das Betriebssystem ist somit vollkommen unbrauchbar für
> Echtzeitexperimente.

auch das wollte niemand wissen.


Es will eine FTDI Chip abfragen, dieser liefert so langsam daten, das 
das schon vor 10Jahren auf jeden PC funktioniert hat.

Hier wird nur ein Fehler in der Anwendungssoftware sein, es muss kein 
Treiber geschrieben werden und auch nicht auf Interrupts reagiert 
werden. Denn der Treibe vom FTDI liefert ein event.

von Max (Gast)


Lesenswert?

Also naja, ist jetzt eine Menge. bgw_funkmodul_DoWork unterscheidet 2 
modi des Funkmoduls. im 2. jeweils was durch eine boolsche Variable 
unterschieden wird, werden alle Daten durchgelassen.
Der Backgroundworker deligiert nach dem Finden eines Zeichen an die Sub 
Work data.
Der Thread reiveData schreibt einfach in einen Buffer, was ein Bytearray 
darstellt.
Der Testvorgang findet in einem Backgroundworker statt und ist hier 
nicht darstellt.
Prinzipiell ist das jetzt schon viel Code. Falls das erschlägt oder ich 
das anders, lieber erklärend darstellen soll, mache ich das gerne.
Auch könnte ich den Ausschnitt des Testvorgangs darstellen.
1
 Private WithEvents Funkmodul As New FTDI() 'FTDI Bibliothek
2
3
'Delegate für das Funkfunkmodul
4
    Private Delegate Sub Delegat_Funkmodul_Data_Received(ByVal dIN As String)
5
    Private Funkmodul_Data_Received As New Delegat_Funkmodul_Data_Received(AddressOf Funkmodul_Work_Data)
6
7
'Thread aufgerufen in frm_main_Load
8
    Private Sub Funkmodul_DataReceived()
9
10
        Dim count As UInteger = 0
11
        Dim din(1) As Byte
12
        Dim bytesread As UInteger = 0
13
14
        While True
15
16
            Funkmodul.GetRxBytesAvailable(count)
17
18
            If count > 0 Then
19
                Funkmodul.Read(din, 1, bytesread)
20
                Funkmodul_fifo(Funkmodul_schreibe_pointer) = din(0)
21
                Funkmodul_schreibe_pointer += 1
22
                If Funkmodul_schreibe_pointer = UBound(Funkmodul_fifo) + 1 Then Funkmodul_schreibe_pointer = 0
23
24
            End If
25
26
            Threading.Thread.Sleep(1)
27
28
        End While
29
30
    End Sub
31
32
 Private Sub bgw_funkmodul_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgw_Funkmodul.DoWork
33
34
        Dim command As String = ""
35
        Dim i As Integer = 0
36
        Dim j As Integer = 0
37
        Dim Anz_Zeichen As Integer = 0
38
        Dim start As Integer = 0
39
40
        While True
41
42
            If Me.bgw_Funkmodul.CancellationPending Then Exit Sub
43
44
            While Funkmodul_schreibe_pointer <> Funkmodul_lese_pointer
45
46
                If bol_funk_init Then
47
                    'Kommandmode
48
49
                    If Funkmodul_found_startzeichen Then
50
51
                        If i = 2 Then
52
                            Anz_Zeichen = Funkmodul_fifo(Funkmodul_lese_pointer) + 1
53
                        End If
54
55
                        command += Chr(Funkmodul_fifo(Funkmodul_lese_pointer))
56
57
                        If i = Anz_Zeichen + 2 Then
58
59
                            Funkmodul_Data_Received(command)
60
                            Funkmodul_found_startzeichen = False
61
                            command = ""
62
                        Else
63
                            i += 1
64
                        End If
65
                    Else
66
                        If Chr(Funkmodul_fifo(Funkmodul_lese_pointer)) = STX Then Funkmodul_found_startzeichen = True : i = 1 : command = STX
67
                    End If
68
69
                Else
70
                    'Transparentmode
71
72
                    If Chr(Funkmodul_fifo(Funkmodul_lese_pointer)) = STX Then
73
                        Funkmodul_found_startzeichen = True
74
                        command = STX
75
                    Else
76
                        command += Chr(Funkmodul_fifo(Funkmodul_lese_pointer))
77
                    End If
78
79
                    If Funkmodul_found_startzeichen Then
80
81
                        If Chr(Funkmodul_fifo(Funkmodul_lese_pointer)) = ACK Then 'And command.Substring(18, 1) <> 1 Then 'Ack von RC
82
                            Funkmodul_found_acknowledge = True
83
                        End If
84
85
                        If Chr(Funkmodul_fifo(Funkmodul_lese_pointer)) = ETX Then
86
                            Funkmodul_found_stopzeichen = True
87
                        End If
88
89
                        If Funkmodul_found_stopzeichen Then
90
                            'Jetzt noch den CRC 
91
                            If j = 4 Then
92
                                Funkmodul_Data_Received(command)
93
                                command = ""
94
                                Funkmodul_found_startzeichen = False
95
                                Funkmodul_found_stopzeichen = False
96
                                j = 0
97
                            Else
98
                                j += 1
99
                            End If
100
                        Else
101
102
                        End If
103
104
                    End If
105
106
                End If
107
108
                Funkmodul_lese_pointer += 1
109
                If Funkmodul_lese_pointer = UBound(Funkmodul_fifo) + 1 Then Funkmodul_lese_pointer = 0
110
111
            End While
112
            System.Threading.Thread.Sleep(3)
113
        End While
114
115
    End Sub
116
117
 Private Sub Funkmodul_Work_Data(ByVal dIN As String)
118
        ' InvokeRequired required compares the thread ID of the 
119
        ' calling thread to the thread ID of the creating thread. 
120
        ' If these threads are different, it returns true. 
121
        'Invoke the sub to allow cross thread calls to pass safely
122
        If Me.InvokeRequired Then
123
124
            Dim del As New Funkmodul_Work_Delegate(AddressOf Funkmodul_Work_Data)
125
            Dim args As Object() = {dIN}
126
            Me.BeginInvoke(del, args)
127
128
        Else
129
130
            If bol_funk_init Then
131
132
                Select Case dIN
133
134
                    Case ACK_AMBER_KOMMAND_MODE '2. Variable: in welchem Kanal bin ich bei Programmstart
135
                        bol_funkmodul_kommandmode = True
136
                        bol_funkmodul_tranzparentmode = False
137
                    Case ACK_AMBER_TRANSPARENT_MODE
138
                        bol_funkmodul_kommandmode = False
139
                        bol_funkmodul_tranzparentmode = True
140
                    Case ACK_AMBER_SET_CHANNEL_0 '2. Variable: in welchem Kanal bin ich bei Programmstart
141
                        bol_funkmodul_channel_0 = True
142
                        bol_funkmodul_channel_1 = False
143
                    Case ACK_AMBER_SET_CHANNNEL_1
144
                        bol_funkmodul_channel_1 = True
145
                        bol_funkmodul_channel_0 = False
146
                    Case Else
147
148
                End Select
149
150
            Else
151
152
                RC_ID = dIN.Substring(9, 8)
153
154
                Select Case True
155
                    'Case dIN.Contains("CU") And dIN.Contains("BV") And dIN.Contains("CV") And dIN.Contains("BT") And dIN.Contains("BN")
156
                    '    'ERSCHÜTTERUNGSSENSORTEST
157
158
                    Case dIN.Contains("KP66") 'nochmal überprüfen, da es ein up and down Event sein kann und vielleicht beide gesetzt sein müssen
159
160
                        If (Login_Test = False) Then 'Taste_OK_pressed
161
162
                            If (Taste_F1_F2_pressed = True) Then
163
164
                                Taste_OK_pressed = True
165
                                Me.pic_Tasten_getestet.SizeMode = PictureBoxSizeMode.StretchImage
166
                                Me.pic_Tasten_getestet.Image = My.Resources.Tasten_Pfeil_ok
167
168
                            Else
169
                                'Log-File
170
                            End If
171
172
und so weiter ...

von Peter II (Gast)


Lesenswert?

naja, der code ist so leider sehr schwer lesbar. Bitte als Anhang.

Aber die ganzen

System.Threading.Thread.Sleep(3)

sind schon mal falsch. Es gibt überhaupt keinen Grund zu warten. Du 
bekommst einen event wenn neue Daten reinkommen. Warum sollte man extra 
noch warten?

von oszi40 (Gast)


Lesenswert?

Max schrieb:
> Also das Funkmodul macht "auch" Probleme und funktioniert bei 2
> aufeinanderfolgenden Testvorgängen meist nicht.

Wenn kein ausreichendes Zeitfenster ist, alle Pakete GESUND zu 
empfangen, ist Dein Zug schon abgefahren. Entwerder behilfst Du Dir mit 
Werten aus dem Cache oder wirfst diese falschen Ergebnisse rechtzeitig 
weg.

von Peter II (Gast)


Lesenswert?

nächsten fehler:

> Funkmodul.GetRxBytesAvailable(count)
>
>            If count > 0 Then
>               Funkmodul.Read(din, 1, bytesread)

was ist wenn mal mehr als 1 Zeichen kommt? Dann liest du nur das erste 
zeichen. du musst alles lesen was da ist!

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

MaWin schrieb:

> Unter Linux sieht es übrigens nicht besser aus.

Doch, sogar deutlich besser. Für Linux gibt es reichlich 
Erweiterungen/Modifizierungen:

- RTLinux (LinuxCNC läuft darunter)
- RTAI
- LibeRTOS
- Xenomai
- usw.

Da kann man sich nach Belieben austoben :-)

von Max (Gast)


Lesenswert?

oszi40 schrieb:
> Wenn kein ausreichendes Zeitfenster ist, alle Pakete GESUND zu
> empfangen, ist Dein Zug schon abgefahren. Entwerder behilfst Du Dir mit
> Werten aus dem Cache oder wirfst diese falschen Ergebnisse rechtzeitig
> weg.

das habe ich nicht verstanden. Welche Werte und wie bekomme ich die?

Die Pausen habe ich wegen der Systemauslastung gemacht, aber lasse ich 
gerne weg.

Code kommt gleich in einem Anhang.

von Peter II (Gast)


Lesenswert?

Max schrieb:
> Die Pausen habe ich wegen der Systemauslastung gemacht, aber lasse ich
> gerne weg.

dann arbeitest du nicht mit events. Schau dir die doku von FTDI an. 
Normalerweise brauchst du nicht mal einen Backgrundworkder zum einlesen.

von Max (Gast)


Lesenswert?

Peter II schrieb:
>> Funkmodul.GetRxBytesAvailable(count)
>>
>>            If count > 0 Then
>>               Funkmodul.Read(din, 1, bytesread)

ist eine Schleife, die solange Daten da sind jeweils 1 Byte in den 
Buffer schreiben. Den Fehler verstehe ich nicht.

von Peter II (Gast)


Lesenswert?

klar hier ist das Problem


>  Private Sub Funkmodul_DataReceived()
>        While True
>
>            Funkmodul.GetRxBytesAvailable(count)
>
>
>        End While

das ist der falsche weg. Entwedewr macht man einfach einen

while true
   Funkmodul.Read(din, 1, bytesread)
end while


oder man arbeitet mit GetRxBytesAvailable und events. So wie du es 
gemacht hast ist es aber falsch.

von Peter II (Gast)


Lesenswert?

Max schrieb:
>>>            If count > 0 Then
>>>               Funkmodul.Read(din, 1, bytesread)
>
> ist eine Schleife, die solange Daten da sind jeweils 1 Byte in den
> Buffer schreiben. Den Fehler verstehe ich nicht.

ich kann zwar nicht VB aber wo ist da eine Schleife? das ist eine IF 
abfrage und keine schleife.

Aber die Prozedur ist sowieso falsch, siehe vorherigen beitrag.

von Max (Gast)


Lesenswert?

Also probiere das gleich aus.

@ Peter: ist doch in einer while(true)-Schleife und fragt dann if ab.

Und was mich durchgehend beschäftigt, wenn hier der Fehler liegt. Wieso 
funktioniert das dennoch an 2 PCs und an einem nicht, denn daraus kann 
ich mir keinen Reim machen.

von Max (Gast)


Angehängte Dateien:

Lesenswert?

also hier noch der Code, habe den in eine vb-Klasse.

von Robert L. (lrlr)


Lesenswert?

Threading.Thread.Sleep(1)

wow, das ist EINE GANZE MILLISEKUNDE !
(ich dachte mir es wäre zeitkritisch ??!)


;-)

der code ansonsten ist vermutlich nicht SOO daneben (sonst würde er ja 
überhaupt nicht funktionieren)

ich würde als erstes mal "cirtical sections" machen..
immer dort wo du auf "globale" Sachen zugreifst...

also z.b. um den teil:
 Funkmodul_fifo(Funkmodul_schreibe_pointer) = din(0)
                Funkmodul_schreibe_pointer += 1
                If Funkmodul_schreibe_pointer = UBound(Funkmodul_fifo) + 
1 Then Funkmodul_schreibe_pointer = 0


usw.

von Robert L. (lrlr)


Lesenswert?

nachtrag: der HauptFehler ist also: dass du nur 1000 Byte pro Sekunde 
einlesen kannst!!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> aber wo ist da eine Schleife?

Da:
1
        While True
2
3
            Funkmodul.GetRxBytesAvailable(count)
4
5
            If count > 0 Then
6
                Funkmodul.Read(din, 1, bytesread)
7
                Funkmodul_fifo(Funkmodul_schreibe_pointer) = din(0)
8
                Funkmodul_schreibe_pointer += 1
9
                If Funkmodul_schreibe_pointer = UBound(Funkmodul_fifo) + 1 Then Funkmodul_schreibe_pointer = 0
10
11
            End If
12
13
            Threading.Thread.Sleep(1)
14
15
        End While

von Peter II (Gast)


Lesenswert?

Max schrieb:
> @ Peter: ist doch in einer while(true)-Schleife und fragt dann if ab.

ja hatte ich übersehen, ich bin davon ausgegangen das das die Sub nur 
bei einem event vom FTDI aufgefufen wird.

> Und was mich durchgehend beschäftigt, wenn hier der Fehler liegt. Wieso
> funktioniert das dennoch an 2 PCs und an einem nicht, denn daraus kann
> ich mir keinen Reim machen.
das ist bei Softwarefehler immer der Fall, mal geht mal nicht. Ändere 
ist mal das auslesen und enterne die sleeps. Die CPU lasst darf dabei 
nicht steigen! Wenn doch hast du noch einen fehler. Dann Teste noch mal.

von Robert L. (lrlr)


Lesenswert?

>Die CPU lasst darf dabei
>nicht steigen

doch das wird sie,
ein kern wird 100% ausgelastet:
warum sollte sie auch nicht tun???

die sleep sind (prinzipiell) nicht sooo falsch, ...
nur 1 Millisekunde warten, nach jedem Byte ist etwas "lang"

von Peter II (Gast)


Lesenswert?

Robert L. schrieb:
> doch das wird sie,
> ein kern wird 100% ausgelastet:
> warum sollte sie auch nicht tun???

weil man nur ein Read macht, diese Read blockiert bis daten ankommen und 
bracuht dabei keine CPU zeit.


> die sleep sind (prinzipiell) nicht sooo falsch, ...
> nur 1 Millisekunde warten, nach jedem Byte ist etwas "lang"
doch ist es. Sleep hier absolut falsch.

von Max (Gast)


Lesenswert?

Also der Änderungsversuch hat nichts gebracht. Mache die ms im 
receiveThread noch weg.

Nochmals @ Peter: zu dem Softwarefehler. Auf den anderen Pc's gibt es 
keine Fehler, der Test wurde an verschiedenen Tagen mehrmals 
wiederhohlt. Von diesem Gedanken ausgehend habe ich halt versucht dem 
Problem auf den Grund zu gehen.

Eure Vorschläge neheme ich tausend dankend an und probiere alles aus, 
doch wieso das einen Unterschied ergibt? Wird es an den anderen Pc's 
dann möglicherweise nicht mehr laufen und ich brauche 2 
Softwareversionen?

von Peter II (Gast)


Lesenswert?

Max schrieb:
> Eure Vorschläge neheme ich tausend dankend an und probiere alles aus,
> doch wieso das einen Unterschied ergibt? Wird es an den anderen Pc's
> dann möglicherweise nicht mehr laufen und ich brauche 2
> Softwareversionen?

nein nur eine die funktioniet. Hat der andere PC die gleiche CPU anzahl?

von Peter II (Gast)


Lesenswert?

Max schrieb:
> Also der Änderungsversuch hat nichts gebracht. Mache die ms im
> receiveThread noch weg.

dann zeige mal bitte wieder den code (als anhang) damit man sieht was du 
gemacht hast.

von Max (Gast)


Lesenswert?

8 kerne a 3,2 ghz und und 4 a 2,4 ghz funktioneriert es. und bei 4 a 2,4 
ghz funktioniert es.

        While True

            Funkmodul.GetRxBytesAvailable(count)

            Funkmodul.Read(din, 1, bytesread)
            Funkmodul_fifo(Funkmodul_schreibe_pointer) = din(0)
            Funkmodul_schreibe_pointer += 1
            If Funkmodul_schreibe_pointer = UBound(Funkmodul_fifo) + 1 
Then Funkmodul_schreibe_pointer = 0

        End While

passt so?

von Max (Gast)


Lesenswert?

und die 3 ms weg bei dem Backgroundworker

von Max (Gast)


Lesenswert?

und meinte bei 4 Kernen a 3,1 ghz funktioniert es nicht. (anstatt von 
"und bei 4 a 2,4 ghz funktioniert es.")

von Peter II (Gast)


Lesenswert?

das

> Funkmodul.GetRxBytesAvailable(count)

kann auch weg


> und die 3 ms weg bei dem Backgroundworker
das kannst erstmal bleiben, sollte aber auch später entfernt werden. Und 
zwar durch ein event

http://msdn.microsoft.com/de-de/library/system.threading.eventwaithandle.aspx

dann braucht man keine wartezeit mehr.

von Udo S. (urschmitt)


Lesenswert?

Das:
While True

      Funkmodul.GetRxBytesAvailable(count)
...

ist auf einem Multithreading System völlig daneben.
Da die GetRxBytesAvaiable Funktion zu 99,99% der zeit eben keine Bytes 
zu lesen hat wird die Schleife mit voller Geschwindigkeit ausgeführt und 
erzeugt ein Haufen leere Last.
Hier muss man (wie auch immer in basic) sich durch einen Event rufen 
lassen oder einen blockierenden Receive Aufruf mit einem Timeout machen. 
Das gibt dem Betriebssystem die Möglichkeit die Rechenzeit abzugeben.

von Robert L. (lrlr)


Lesenswert?

>weil man nur ein Read macht, diese Read blockiert bis daten ankommen und
>bracuht dabei keine CPU zeit.

tut es das?
ich weiß es nicht, meine Antwort war eher "allgemein"


Funkmodul.Read(din, 1, bytesread)

die Funktion schaute für mich (auf den 1. blick) NICHT blockierend aus..
ist sie aber anscheinend (allerdings mit Default timeout von 500ms???)
d.h. man sollte hier wohl auf exception achten (vielleicht ist dass das 
problem?)


WENN man eine blockierende funktion verwendet, DANN ist das weglassen 
vom sleep sicher ok usw. usw.

die blockierende funktion sollte dann aber (trotzdem) ein timeout haben 
(z.b. 1 sekunde)

um zwischendurch prüfen zu können ob man  den thread gegebenenfalls 
korrekt zu beenden hat....

von Peter II (Gast)


Lesenswert?

Robert L. schrieb:
> die Funktion schaute für mich (auf den 1. blick) NICHT blockierend aus..
> ist sie aber anscheinend (allerdings mit Default timeout von 500ms???)
> d.h. man sollte hier wohl auf exception achten (vielleicht ist dass das
> problem?)

eigentlich sind alle read funktionen standardmäßig blockierend.

> die blockierende funktion sollte dann aber (trotzdem) ein timeout haben
> (z.b. 1 sekunde)
> um zwischendurch prüfen zu können ob man  den thread gegebenenfalls
> korrekt zu beenden hat....
nicht zwingend. Dafür kann man auch einfach das Handle schließen und 
damit kommt das Read mit einem fehler zurück.

von Robert L. (lrlr)


Lesenswert?

>eigentlich sind alle read funktionen standardmäßig blockierend.

ja, in VB (.net) vielleicht..
das kann schon sein..
kenn ich nicht..


ich bin wie gesagt, davon ausgegangen, dass die funktion einfach 0 
zurück liefert wenn keine daten vorhanden sind..
in der Doku steht da auch "nix genaues"... finde ich..

von Peter II (Gast)


Lesenswert?

Robert L. schrieb:
> ja, in VB (.net) vielleicht..
> das kann schon sein..
> kenn ich nicht..

wo denn nicht? In C ist es auch der Fall. In Perl auch. Welchen Read ist 
denn standardmäßig nicht blockierend?

von Robert L. (lrlr)


Lesenswert?

1. bester

http://arduino.cc/en/Serial/read

Returns the first byte of incoming serial data available (or -1 if no 
data is available) - int

;-)

(das code beispiel dort ist allerdings schlecht..)

von Robert L. (lrlr)


Lesenswert?

kleiner nachtrag:

das REad um das wir hier diskutieren, schaut nicht nach dem 
"serialPort.Read" von VB.net aus

ich halte es weiterhin für möglich, dass es nicht blockierend ist..
bytesread ist nämlich 0

beim serialPort.Read, wäre der 3. parameter aber die anzahl zu lesender 
byte.. ?!

von Peter II (Gast)


Lesenswert?

Robert L. schrieb:
> ich halte es weiterhin für möglich, dass es nicht blockierend ist..
> bytesread ist nämlich 0

bytesread ist der rückgabewert, wie viele zeichen gelesen wurden. Und ja 
Read blockiert nicht wenn das Handle geschlossen wurden oder man 0 
zeichen lesen will.

von Robert L. (lrlr)


Lesenswert?

laut
http://msdn.microsoft.com/de-de/library/ms143549%28v=vs.80%29.aspx
nicht

(aber vielleicht schau ich ja an der falschen stelle?)

von Peter II (Gast)


Lesenswert?

Robert L. schrieb:
> laut
> http://msdn.microsoft.com/de-de/library/ms143549%2...
> nicht

wie solle es ohne blockierung denn zu einer TimeoutException kommen?

von Robert L. (lrlr)


Lesenswert?

meine antwort bezog sich darauf:
>bytesread ist der rückgabewert,

der 3. Parameter ist NICHT

> wie viele zeichen gelesen wurden


veilleicht ist es ja non-blocking wenn man den 3. parameter mit 0 füllt 
.., was weiß ich bei 2 zeilen doku..

von Viktor N. (Gast)


Lesenswert?

Viel sinnvoller als die Zeit mit dem PC zu verplempern waere die 
zeitkritischen Dinge auf einen Controller auszulagern und den PC nur als 
Control- & Visualisierer zu verwenden.

von Peter II (Gast)


Lesenswert?

Viktor N. schrieb:
> Viel sinnvoller als die Zeit mit dem PC zu verplempern waere die
> zeitkritischen Dinge auf einen Controller auszulagern

es gibt hier überhaupt nichts zeitkritisches.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.