Multithreading an Multiprozessorsystemen

Railer

Mitglied
Hi!

Ich beschäftige mich im Moment etwas mit Multithreading und mir ist eine Sache aufgefallen: Wenn ich zwei SQL-Abfragen gleichzeitig laufen lasse, werden sie zwar auch gleichzeitig abgearbeitet, allerdings beim DataGrid füllen wartet ein Thread immer bis ein Grid gefüllt ist und dann macht der andere Thread mit dem Füllen des zweiten DataGrid weiter. Ist es möglich es so zu machen, dass der eine Grid auf einem Prozessor läuft und der andere auf dem zweiten. Eigentlich müsste das doch das BS übernehmen oder? Warum werden dann beim debuggen die Grids nacheinander gefüllt?

Hier der ungefähre Code:

Code:
    'Global
    Dim MethodInvokerGrid1 As New MethodInvoker(AddressOf Me.DataBindToDataGrid)
    Dim MethodInvokerGrid2 As New MethodInvoker(AddressOf Me.DataBindToDataGrid2)

    'Prozedur, die beide Threads startet
    Private Sub MultiThreadHoff()
        'Grid1 Thread
        Dim aDBThread As Thread
        aDBThread = New Thread(New ThreadStart(AddressOf QueryDataBaseHoff))
        aDBThread.IsBackground = True
        aDBThread.Name = "DBThread"
        aDBThread.Start()

        'Grid2 Thread
        Dim aDBThread2 As Thread
        aDBThread2 = New Thread(New ThreadStart(AddressOf QueryDataBaseHoff2))
        aDBThread2.IsBackground = True
        aDBThread2.Name = "DBThread2"
        aDBThread2.Start()
    End Sub

   'Füllen des Datasets für den Grid1
   Public Sub QueryDataBaseHoff()
        aDS = New DataSet
        Dim cmd As New OdbcCommand(sSQLHoff, aConHoff)
        aAdpHoff = New OdbcDataAdapter(cmd)
        aAdpHoff.Fill(aDS, sTblName)

        ' Asynchroner Aufruf
        Me.BeginInvoke(MethodInvokerGrid1)
    End Sub

   'Füllen des Datasets für den Grid2
    Public Sub QueryDataBaseHoff2()
        aDS2 = New DataSet
        Dim cmd As New OdbcCommand(sSQLHoff2, aConHoff2)
        aAdpHoff2 = New OdbcDataAdapter(cmd)
        aAdpHoff2.Fill(aDS2, sTblName)

        ' Asynchroner Aufruf
        Me.BeginInvoke(MethodInvokerGrid2)
    End Sub

    'Grid1 füllen
    Public Sub DataBindToDataGrid()
        DataGrid1.DataSource = aDS
        DataGrid1.DataMember = sTblName

        aAdpHoff = Nothing
        aDS = Nothing
    End Sub

    'Grid2 füllen
    Public Sub DataBindToDataGrid2()
        DataGrid2.DataSource = aDS2
        DataGrid2.DataMember = sTblName

        aAdpHoff2 = Nothing
        aDS2 = Nothing
    End Sub
 
Frage: Greifst du mit deiner SQL Abfrage auf dieselbe Datenbank oder Tabelle. Vielleicht ist das Problem ja einfach, dass sich die Threads eine Resource teilen, dann müsste natürlich einer auf den anderen warten.
 
Die Datenbank ist Informix, läuft auf einem UNIX Multiprozessor Server und als Multithreaded eingerichtet.

Auf meinem DoppelXeon Server ist der neuste ODBC-Treiber installiert. Das Problem ist, ich weiss nicht ob der ODBC-Treiber Multithreading ünterstützt und ob er es zulässt, dass ich 2 Abfragen über ihn gleichzeitig starte.

In meinem Programm habe ich in jedem Thread eine odbcConnection, somit muss es so sein, dass das Programm 2 Verbindungen aufbaut, 2 Abfragen schickt und die beiden Grids füllt, alles gleichzeitig. Theoretisch. Nur in der Praxis habe ich marginallen Geschwindigkeitszuwachs im Gegenteil zum gleichen Test, aber mit einem SQL-Servrer 2000 und den .Net SqlClient komponenten. Da habe ich Faktor 2 Geschwindigkeitszuwachs, sprich 2 gleiche Abfragen dauern genauso lang, wie eine von denen. Und diesen geilen Effekt will ich natürlich auch für die Informix Datenbank haben. Liegt es vielleicht am ODBC-Treiber? Informix müsste doch eigentlich besser sein als SQL-Server.
 
Also, das könnte natürlich sein, dass das am ODBC-Treiber liegt aber wenn Informix Multithreading unterstützt wird es dazu passend auch einen ODBC Treiber geben oder? Kenn mich aber nicht mit Informix aus. Vielleicht mal direkt bei IBM nachfragen?

Gruß
 
Zurück