tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
0
ZUGRIFFE
381
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    flotschie flotschie ist offline Mitglied Silber
    Registriert seit
    Jun 2004
    Beiträge
    85
    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

  1. [ANT] regexp [a-z] matched nicht wie gewünscht
    Von Rick Dangerous im Forum Sonstige Sprachen
    Antworten: 3
    Letzter Beitrag: 11.02.10, 16:52
  2. Kamera-bewegung nicht wie gewünscht.
    Von rignoriz im Forum Cinema 4D
    Antworten: 2
    Letzter Beitrag: 07.06.08, 17:01
  3. Eigenes JSP Tag funktioniert nicht wie gewünscht
    Von wSam im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 07.12.06, 10:27
  4. [VB.net] Neuer EventHandler bei neuem Objekt
    Von virus-2k im Forum .NET Windows Forms
    Antworten: 15
    Letzter Beitrag: 27.11.06, 13:20
  5. css geht nicht wie gewünscht
    Von maxcom im Forum CSS
    Antworten: 5
    Letzter Beitrag: 15.12.04, 18:25