ERLEDIGT
NEIN
NEIN
ANTWORTEN
0
0
ZUGRIFFE
381
381
EMPFEHLEN
-
Also dieses Problem ist ein etwas komplexeres und ich hoff ich kann es einigermassen erklären. Ich wurde vorgewarnt, wenn man mit Threads arbeitet, kann es durchaus zu unerklärlichen Ereignissen
kommen. Das ist jetzt bei mir geschehen und ich bin am verzweifelnd - hab mir alles durchgelesen was ich finden konnte aber nichts erklärt mir das.
Grundsätzlich gehts um einen Datastream, der mir per Eventhandler neue Kurse für Wertpapiere liefert. Kurze Info: Geld ist der Fachjargon für den Preis, um den man das Wertpapier (im folgenden WP genannt) VERKAUFEN könnte, Brief ist der Preis, um den man das WP KAUFEN könnte. Diese zwei Kurse kommen meist zeitgleich in derselben Sekunde, aufgeteilt auf einem Eventhandler für die Briefkurse, und einem für die Geldkurse.
Um die Kurse auswerten zu können, habe ich mal ein Wertpapierobjekt angelegt, das dann in einer Wertpapierliste verwaltet wird. Zusätzlich werden die Eventhandler per eigens angelegten Queues entlastet. Die neu eintreffenden Kurse werden im Wertpapierobjekt gespeichert, dieses wird in die Queue gelegt. Danach wird per Autoresetevent das Go für die Threads, die die Queues abarbeiten, gegeben.
Die Queues wurden global so angelegt:
Code :1 2
Public Shared myqueue As Queue = Queue.Synchronized(New Queue) Public Shared myqueue_geld As Queue = Queue.Synchronized(New Queue)
Code der Wertpapierklasse:
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
Public Class Wertpapier Private key As Integer Private zeit_neu As Date Private brief_neu As Single Private geld_neu As Single Public Function get_geld_neu() As Single Return geld_neu End Function Public Function set_geld_neu(ByVal geneu As Single) geld_neu = geneu End Function Public Function get_brief_neu() As Single Return brief_neu End Function Public Function set_brief_neu(ByVal brneu As Single) brief_neu = brneu End Function Public Function get_zeit_neu() As Date Return zeit_neu End Function Public Function set_zeit_neu(ByVal zneu As Date) zeit_neu = zneu End Function Public Function get_Key() As Integer Return key End Function Public Function set_Key(ByVal key_nr As Integer) key = key_nr End Function End Class
Code der Wertpapierliste:
Code :1 2 3 4 5 6 7 8 9 10 11
Public Class Wertpapierliste Inherits System.Collections.Hashtable Public Overloads Sub Add(ByVal wp As Wertpapier) Add(wp.get_Key, wp) End Sub Public Function get_wp_by_sym(ByVal sym As Integer) As Wertpapier Return Me(sym) End Function End Class
Code der Eventhandler. Dabei habe ich (nach Nachforschung) die Enter-Leave Methoden der Monitorklasse verwendet um gesicherten Zugriff auf die Queue zu erlangen. Dieser Code nimmt die neuen Kurse und Zusatzinformationen auf und speichert sie im Wertpapierobjekt. Dieses wird anschliessend in die Queue gelegt.
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
Private Sub ds_Brief(ByVal SymbolNr_brief As Integer, ByVal Kurs_brief As Single, ByVal Volume As Single, ByVal Zeit_brief As Date) Handles ds.Brief Dim wp_for_queue_brief As Wertpapier SyncLock wp_list wp_for_queue_brief = wp_list.get_wp_by_sym(SymbolNr_brief) End SyncLock SyncLock wp_for_queue_brief With wp_for_queue_brief .set_brief_neu(Kurs_brief) .set_zeit_neu(Zeit_brief) End With Monitor.Enter(myqueue) myqueue.Enqueue(wp_for_queue_brief) Monitor.Exit(myqueue) End SyncLock start_work.Set() Label4.Text = System.Threading.Interlocked.Increment(counter_1) End Sub
Und der Eventhandler für den Geld-Kurs:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Private Sub ds_Geld(ByVal SymbolNr_geld As Integer, ByVal Kurs_geld As Single, ByVal Volume_geld As Single, ByVal Zeit_geld As Date) Handles ds.Geld Dim wp_for_queue As Wertpapier SyncLock wp_list wp_for_queue = wp_list.get_wp_by_sym(SymbolNr_geld) End SyncLock SyncLock wp_for_queue With wp_for_queue .set_geld_neu(Kurs_geld) End With Monitor.Enter(myqueue_geld) myqueue_geld.Enqueue(wp_for_queue) Monitor.Exit(myqueue_geld) start_work_geld.Set() End SyncLock End Sub
Jetzt fehlt nur noch der Workerthread, der die Brief-Queue abarbeitet:
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
Public Sub CheckBrief() Dim wp As Wertpapier Dim brief_alt As Single Dim geld_alt As Single Dim brief_neu As Single Dim zeit_tai As Date Dim symbolnummer As Integer Do start_work.WaitOne(10, False) If myqueue.Count > 0 Then Monitor.Enter(myqueue) wp = myqueue.Dequeue() SyncLock wp zeit_tai = wp.get_zeit_neu brief_neu = wp.get_brief_neu brief_alt = wp.get_brief Monitor.Exit(myqueue) End SyncLock ...da kommt für das Problem nicht wesentlicher Code... ' dann neue Werte setzen: SyncLock wp wp.set_brief(brief_neu) wp.set_zeit(zeit_tai) End SyncLock End If wp = Nothing Loop Until thread_abbrechen End Sub
Und der der die Geld-Ereignisse abarbeitet:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Public Sub CheckGeld() Dim wp As Wertpapier Do start_work_geld.WaitOne() If thread_abbrechen = True Then Exit Sub Monitor.Enter(myqueue_geld) wp = myqueue_geld.Dequeue() Monitor.Exit(myqueue_geld) SyncLock wp wp.set_geld(wp.get_geld_neu) End SyncLock Loop Until thread_abbrechen End Sub
So und jetzt komme ich zum eigentlichen Problem. Beim Workerthread werden bei den Zeilen
Code :1 2
zeit_tai = wp.get_zeit_neu brief_neu = wp.get_brief_neu
falsche Werte in die Variable brief_neu eingelesen. Und zwar Werte, die da nie drinnenstehn dürften, weil diese MANCHMAL die Geld-Werte sind. Ich betone, manchmal. Meistens sind die richtigen Briefwerte drinnen. Das heisst, irgendwie schreibt mir ab und zu die Checkgeld Sub die Geldwerte in die Briefwerte rein. Oder es passiert schon im Code des Eventhandler etwas falsches. Ich habe keine Ahnung.....
Ich weiss das ist ein bisschen kompliziert das ganze aber vielleicht verstehts einer und kann mir helfen *flehentlich schau*....Geändert von flotschie (02.02.05 um 23:38 Uhr)
Ähnliche Themen
-
[ANT] regexp [a-z] matched nicht wie gewünscht
Von Rick Dangerous im Forum Sonstige SprachenAntworten: 3Letzter Beitrag: 11.02.10, 16:52 -
Kamera-bewegung nicht wie gewünscht.
Von rignoriz im Forum Cinema 4DAntworten: 2Letzter Beitrag: 07.06.08, 17:01 -
Eigenes JSP Tag funktioniert nicht wie gewünscht
Von wSam im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 07.12.06, 10:27 -
[VB.net] Neuer EventHandler bei neuem Objekt
Von virus-2k im Forum .NET Windows FormsAntworten: 15Letzter Beitrag: 27.11.06, 13:20 -
css geht nicht wie gewünscht
Von maxcom im Forum CSSAntworten: 5Letzter Beitrag: 15.12.04, 18:25





Zitieren
Login





